你会单元测试吗


单元测试对我们程序员来说是非常重要的

[TOC]

学习目标

  • [ ]1、单元测试

    • 什么是单元测试
    • 为什么使用单元测试
  • [ ]2、Junit 4 基础

    • 环境搭建
    • 创建测试类
    • 运行测试类
    • 什么是断言
    • Junit 常用注解
    • 官方 Demo
  • [ ]3、新断言

    • 新断言的使用
    • 新断言类的替换
  • [ ]4、常规使用

    • 类的单元测试创建
    • 运行多个测试

单元测试

百度百科

百度百科:单元测试

有什么用

你认为单元测试应该怎么做?

main 函数,调用你的业务方法。

Junit4 的使用

Junit4.13 GitHub 官网

Junit 官网

Junit4.13 的新特性

HelloWorld

pom 文件引入

<dependencies>
    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
        <scope>test</scope>
    </dependency>
</dependencies>

测试类:

package com.stj.service;

import org.junit.Test;
/**
 * @author shaotongjie
 * @date 2020/6/12 20:45
 */
public class UserServiceTest {

    @Test
    public void addtest(){
        UserService userService = new UserService();
        boolean flag  =  userService.add(5,5);
        System.out.println(flag);
    }
}

Assert 断言

静态函数 解释
assertArrayEquals(expecteds, actuals) 查看两个数组是否相等。
assertEquals(expected, actual)
assertNotEquals(first, second)
查看两个对象是否相等。类似于字符串比较使用的equals()方法
查看两个对象是否不相等。
assertNull(object)
assertNotNull(object)
查看对象是否为空。
查看对象是否不为空。
assertSame(expected, actual)
assertNotSame(unexpected, actual)
查看两个对象的引用是否相等。类似于使用“==”比较两个对象
查看两个对象的引用是否不相等。类似于使用“!=”比较两个对象
assertTrue(condition)
assertFalse(condition)
查看运行结果是否为true。
查看运行结果是否为false。
assertThat(actual, matcher) 查看实际值是否满足指定的条件
fail() 让测试失败

Junit 常用注解

  1. @Test 测试方法
    • (expected = XXException.class)
    • (timeout=xxx)
  2. @Ignore 被忽略的测试方法
  3. @Before 每一个测试方法之前运行
  4. @After 每一个测试方法之后运行
  5. @BeforeClass 所有测试开始之前运行
  6. @AfterClass 所有测试结束之后运行
  7. @RunWith就是一个运行器
    • @RunWith(JUnit4.class)就是指用JUnit4来运行(默认,可以不用写)
    • @RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境
    • @RunWith(Suite.class)的话就是一套测试集合

官方Demo

AssertTests.java

新断言

新断言 hamcrest

常用的核心新断言,核心匹配器:

import static org.hamcrest.CoreMatchers.*;

但是,需要具体的一些边界值的操作,就需要引入扩展包

pom 中加入

<dependency>
    <groupId>org.hamcrest</groupId>
    <artifactId>hamcrest-library</artifactId>
    <version>1.3</version>
    <scope>test</scope>
</dependency>

Test中引入

import static org.hamcrest.Matchers.*;
package com.stj.service;

import com.stj.entity.User;
import jdk.nashorn.internal.ir.CallNode;
import org.junit.*;

import static org.junit.Assert.fail;

/**
 * @author shaotongjie
 * @date 2020/6/12 20:45
 */
public class UserServiceTest {
    private UserService userService;

    @BeforeClass // 整个类 加载之前就已经运行了
    public static void a1(){
        System.out.println("执行之前执行");
    }

    @AfterClass // 整个类 加载之前就已经运行了
    public static void b1(){
        System.out.println("执行之后执行");
    }

    @Before // 在所有测试单元执行之前,先执行 before 方法
    //每一个 测试单元执行之前,都会执行
    public void abc(){
        userService = new UserService();
        System.out.println("测试单元执行之前,执行的内容");
    }

    @After
    //每一个 测试单元执行之后,都会执行
    public void after(){
        System.out.println("测试方法结束之后,执行的内容!");
    }

    @Test
    public void addtest(){
//        UserService userService = new UserService();
        boolean flag  =  userService.add(5,5);
        System.out.println(flag);
    }

    @Ignore
    @Test
    public void addtest2(){
//        UserService userService = new UserService();
        // 我断定 userService.add  的返回值是 True
        Assert.assertTrue("这个地方不是 true",userService.add(4,5));//9 false
        //fail("我就是作");
    }

    @Test(expected = NullPointerException.class,timeout = 100)
    public void logintest1() throws InterruptedException {
//        UserService userService = new UserService();
        User user =  userService.login(null,null);
        System.out.println(user);
    }

//    @Test
//    public void getNamestest(){
//        String[] names = userService.getNames();
//        // allOf 每一个条件都需要匹配
//        assertThat("用户名不匹配",names,not(allOf(equalTo("xiaobai"))));
//    }

//    @Test
//    public void getAgetest(){
//        int age = userService.getAge(6);// 业务要求: 5 到15 之间
//        //范围, 边界值
//        assertThat("age 的值必须是在 5 到 15 之间",age,allOf(greaterThanOrEqualTo(5),lessThanOrEqualTo(15)));
//    }
}

主要的API接口有如下:

  • 核心
    • anything -绝对匹配,无论什么情况下都会匹配成功;
    • describedAs -添加自定义失败描述
    • is -是否的意思,仅用来改善断言语句的可读性;
  • 逻辑
    • allOf -检查是否包含所有的匹配器,相当于与(&&);
    • anyOf -检查是否包含匹配器中的一个,相当于(||);
    • not - 检查是否与匹配器相反,相当于非(!);
  • 对象
    • equalTo -检查两个对象是否相等;
    • hasToString - 检查Object.toString;
    • instanceOf,isCompatibleType -检查对象是否是兼容类型;
    • notNullValue,nullValue -检查是否是null值;
    • sameInstance -检查对象是否是相同的类型;
  • Beans
    • hasProperty -检查对象是否有某种属性;
  • 集合
    • array -检查array的元素是否和匹配器描述的相同;
    • hasEntry,hasKey,hasValue -测试给定的Map是否有特定的实体、键或者值;
    • hasItem,hasItems -测试集合是否有一个或者多个元素;
    • hasItemInArray -测试数组中是否有某一元素;
  • 数字
    • closeTo给定的数字是否接近于给定的值;
    • greaterThan,greaterThanOrEqualTo,lessThan,lessThanOrEqualTo -给定的数字是否大于、大于等于、小于、小于等于给定的值;
  • 文本
    • equalToIgnoringCase -检查给定的字符串是否与另一字符串在忽略大小写的情况下相同;
    • equalToIgnoringWhiteSpace -检查给定的字符串是否与另一字符串在忽略空格的情况下相同;
    • containsString -检查给定的字符串是否包含某一字符串;
    • endsWith -检查给定的字符串是否以某一字符串结尾;
    • startsWith -检查给定的字符串是否以某一字符串开头;

新断言的再更新

import static org.junit.Assert.assertThat; //删除
// assertThat 不再使用
import static org.hamcrest.MatcherAssert.assertThat;//替换
// 代替为 MatcherAssert.assertThat

单元测试的创建

运行多个测试

其他的测试框架

TestNG


文章作者: 千羽
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 千羽 !
评论
  目录