Junit5(与SpringBoot整合使用)

发布于 2021-03-04  347 次阅读


SpringBoot2.2.0之后默认的junit的版本仲裁是5版本,junit5和junit4有诸多区别

一,Junit5的变化

Spring Boot 2.2.0版本之后开始引入Junit5作为单元测试的默认库

Junit5和之前版本有很大的不同,它由三个不同的子模块组成:Junit Platfrom  ,  Junit Jupiter  ,  Junit Vintage

Junit的三大模块:

  1. Junit Platfrom : Platfrom 是JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试也可以接入
  2. Junit Jupter : 提供Junit新的编程模型,是Junit5新特性的核心,内部包含一个测试引擎,用于在platfrom上运行
  3. Junit vintage:Junit5之前的老版本都是以及它为编程模型,默认Junit5已经自带Junit vintage(已经被Jupter取代),它兼容Junit3x和junit4x

注意:在Spring Boot2.4.0之后,默认不引入Junit vintage模块,使用使用junit4的部分关键字和注解会失效,假如还想使用junit4的语法要导入以下依赖

<dependency>
    <groupId>org.junit.vintage</groupId>
    <artifactId>junit-vintage-engine</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

二,Spring boot使用Junit注解

一,Sring boot 导入Junit的场景启动器

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

二,Junit5的常用注解

JUnit Jupiter支持下列注解,用于配置测试和扩展框架:

    1. @Test:标记方法是一个测试方法,与Junit4不同它没有声明任何属性,因为Jupiter测试引擎是基于它们自己的,而不是基于以前junit4的vintage测试引擎
    2. @DisolatName:设置测试方法或者测试类的名称
    3. @BeforeEach:在每个测试方法之前执行 ,在Junit4中是@Before
    4. @AfterEach:在每个测试方法之后执行,在Junit4中是@After
    5. @BeforeAll:在所有测试方法之前执行,标注方法必须是静态的
    6. @AfterAll:在所有测试方法之后执行,标注方法必须是静态的
    7. @Disabled:禁用测试类和测试方法
    8. @RepeatedTest:用于重复测试
    9. @ParameterizedTest:参数化参数
    10. @TestTemplate:测试用例模板
    11. @TestInstance:标注实类的生命周期
    12. @Timeout:设置参数方法的超时时间

例:

@DisplayName("Demo测试类")//标记测试类的名称
@SpringBootTest //在Junit5中不需要加@RunWith(SpringRunner.class),如果不写SpringBootTest注解就是没有整合Springboot测试驱动
class DemoFqApplicationTests {

    int number;
    //Junit也整合了Spring,可以使用Spring中的注解
    @Autowired
    Bean_fq fq;

    @DisplayName("测试类1,设置超时")
    @Test
    @Timeout(value = 5,unit = TimeUnit.MILLISECONDS)//unit指明时间单位,value声明超时间
    void test1() throws InterruptedException {
        Thread.sleep(5);
        System.out.println(fq.name());

    }

    @DisplayName("重复执行测试类")
    @RepeatedTest(value = 4)//重复方法执行四次
    void repeated(){
        number++;
        System.out.println("重复方法执行的第"+number+"次");

    }

    @DisplayName("被禁用的方法!")
    @Test
    void disable(){

    }


    //在每个方法之前执行
    @BeforeEach
    void before(){
        System.out.println("Before之前执行!!");

    }

    //在每个方法之后执行
    @AfterEach
    void after(){
        System.out.println("After之后执行!!");

    }

    //在使用方法之前执行
    @BeforeAll
    static void beforeall(){

        System.out.println("所有方法之前执行!!");

    }

    //在使用方法之前执行
    @AfterAll
    static void afterall(){

        System.out.println("所有方法之后执行!!");

    }
}

结果:

三,Junit断言机制

断言是编写单元测试用例的核心方式,即期望值是多少,测试的结果是多少,以此来判断测试是否通过。在JUnit Jupiter中,所有的断言org.junit.jupiter.api.Assertions 类中static方法

常见的断言语句:

  1. assertEquals:判断两个对象或者两个原始值是否相等
  2. assertNotEquals:判断两个对象或者两个原始值是否不相等
  3. assertSame:判断两个对象引用是否指向同一个对象
  4. assertNotSame:判断两个对象引用是否不指向同一个对象
  5. assertTrue:判断给定的布尔值是否为true
  6. assertFlase:判断给定布尔值是否为flase
  7. assertNull:判断对象是否为空
  8. assertNotNull:判断对象是否不为空
  9. assertTimeout:判断是否超时
  10. assertThrows:判断是否会引起异常
  11. assertArrayEquals:判断数组是否相等
  12. assertAll:组合断言
  13. fail:快速失败
  14. ....................

注:Executable executable是一个函数式接口

例:

@DisplayName("测试类!!")
@SpringBootTest
public class DemofqApplicationTest1 {

    int a;
    int b;


    @Test
    @DisplayName("断言普通值!!")
    void test1(){
        a=1;
        b=100;
        Assertions.assertEquals(a,b,"值不相等!");//message错误的话提示的信息
    }

    @Test
    @DisplayName("断言对象!")
    void test2(){
        String a = new String();
        String b = new String();
        Assertions.assertSame(a,b,"对象引用不相同!");
    }

    @Test
    @DisplayName("组合断言!")
    void test3(){
       Assertions.assertAll("组合断言!!",
               () -> Assertions.assertTrue(true),
               () -> Assertions.assertEquals(1,2) );
    }

    @Test
    @DisplayName("超时断言!")
    void test4(){
        Assertions.assertTimeout(Duration.ofMillis(5),
                () -> Thread.sleep(5));
    }

    @Test
    @DisplayName("异常断言!")
    void test5(){
        Assertions.assertThrows(Throwable.class,//异常类
                () -> { a=1/0;} );
    }

    @Test
    @DisplayName("快速失败!")
    void test6(){
        System.out.println("快速失败!");
        Assertions.fail("失败!!");
    }
}

结果:

三,其他

一,前置条件

二,嵌套测试

 

 

 

 

 

 


路漫漫其修远兮,吾将上下而求索