1、集成

  • 文档地址https://junit.org/junit5/docs/current/user-guide/

    1、导入包

    1. <dependency>
    2. <groupId>org.springframework.boot</groupId>
    3. <artifactId>spring-boot-starter-test</artifactId>
    4. <scope>test</scope>
    5. </dependency>

    Spring整合Junit以后

  • 编写测试方法:@Test标注(注意需要使用junt5版本的注解)

  • junit类具有Spring的功能,@Autowired比如@Transcation测试完会自动回滚

2、Junit5常用注解

Junit5的注解与Junit4的注解有变化
image.png

@DisplayName("Junit5测试")
@SpringBootTest //加了这个注解就可以使用spring容器中的组件
public class Junit5Test {

    @DisplayName("测试")
    @Test
    void testDisplayName(){
        System.out.println("1");
    }

    @Timeout(value = 500,unit = TimeUnit.MILLISECONDS)
    @Test
    void timeOut() throws InterruptedException {
        Thread.sleep(400);
    }

    @RepeatedTest(value = 4)
    @Test
    void repeatTest(){
        System.out.println("测试多次的测试");
    }

    @Disabled
    @DisplayName("测试2")
    @Test
    void test2(){
        System.out.println("2");
    }

    @BeforeEach
    void testBeforeEach(){
        System.out.println("测试就要开始了");
    }

    @AfterEach
    void testAfterEach(){
        System.out.println("测试结束了");
    }

    @BeforeAll
    static void testBeforeAll(){
        System.out.println("所有测试就要开始了");
    }

    @AfterAll
    static void testAfterAll(){
        System.out.println("所有测试结束了");
    }
}

3、断言(assertions)

断言(assertions)是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是org.junit.jupiter.api.Assertions的静态方法。Junit5内置的断言可以分成如下几个类别:
检查业务逻辑返回的数据是否合理
所有的测试结束以后,会有一个详细的测试报告

1、简单断言

用来对单个值进行简单的测试
image.png

2、数组断言

用来对数组进行断言

    @DisplayName("数组断言")
    @Test
    void testArray(){
        Assertions.assertArrayEquals(new int[]{1,6,3,5},new int[]{1,2,3,4},"不相同");
    }

3、组合断言

用来多个断言组合起来判断

    @DisplayName("组合断言")
    @Test
    void all(){
        Assertions.assertAll("test",()-> Assertions.assertSame("11","22","是的"),()->Assertions.assertTrue(true && true,"错误了"));
    }

4、异常断言

    @DisplayName("异常断言")
    @Test
    void testException(){
        Assertions.assertThrows(ArithmeticException.class,()-> {
            int i =10/0;
        },"居然运行成功");
    }

5、快速失败

    @DisplayName("快速失败")
    @Test
    void  testFail(){
        //一堆运行
        Assertions.fail("测试失败");
    }

4、前置条件(assumptions)

Junit5中的前置条件(assumption【假设】)类似于断言,不同之处在于不满足的断言会使得测试方法失败,而不满足的前置条件只会使得测试方法的执行终止。前置条件可以看成是测试方法执行的前提,当该前提不满足时,就没有继续执行的必要。

  • 前置条件就是当条件失败直接会跳过该方法运行

      @DisplayName("测试前置条件")
      @Test
      void testAssumptions(){
          Assumptions.assumeTrue(false,"结果不是true");
          System.out.println("11111");
      }
    

    5、嵌套测试

    JUnit5 可以通过Java中的内部类和@Nested注解实现嵌套测试,从而可以更好的把相关的测试方法组织在一起。在内部类中可以使用@BeforeEach和@AfterEach注解,而且嵌套的层次没有限制

  • 嵌套的外层无法驱动内层测试

  • 但是内层可以驱动外层的测试

    6、参数化测试

    参数化测试是JUnit5很重要的一个新特性,它使得用不同的参数多次运行测试成为可能,也为我们的单元测试带来许多便利。
    利用@ValueSource等注解,指定入参,我们将可以使用不同的参数进行多次单元测试。而不需要每新增一个参数就新增一个单元测试,省去了很多冗余代码。
    @ValueSource为参数化测试指定入参原来,支持八大基础类以及String类型,Class类型
    @NullSource:表示为参数化测试提供一个null的入参
    @EnumSource:表示为参数化测试提供一个枚举入参
    @CsvFileSource:表示读取指定CSV文件内容作为参数化测试入参
    @MethodSource:表示读取指定方法的返回值作为参数化测试入参(注意方法返回需要是一个流)

当然如果参数化测试仅仅只能做到指定普通的入参还达不到让我觉得惊艳的地步,让我真正感到他的强大之处的地方在于他可以支持外部的各类入参。如CSV,YML,JSON文件甚至方法的返回值也可以作为入参。只需要去实现ArgumentsProvider接口,任何外部文件都可以作为它的入参。

    @ParameterizedTest
    @DisplayName("参数化测试")
    @ValueSource(ints = {1,2,3,4,5})
    void testParameterizedTest(int i){
        System.out.println(i);
    }

    @ParameterizedTest
    @DisplayName("参数化测试")
    @MethodSource("stringProvider")
    void testParameterizedTest2(String s){
        System.out.println(s);
    }

    static Stream<String> stringProvider(){
        return Stream.of("apple","banana");
    }