栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

九、Junit5的使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

九、Junit5的使用

九、Junit5的使用 1、Junit5概述
  • Junit5与之前发布Junit框架有很大的不同,由3个不同的子项目的模块组成
    • Junit5 = Junit Platform + Junit Jupiter + Junit Vintage
  • Junit Platform :Junit Platform 是在JVM上启动测试框架的基础,不仅仅支持Junit自制的测试引擎,其他测试引擎也可以接入
  • Junit Jupiter :Junit Jupiter提供了Junit5的新的编程模型,是Junit5新特性的核心,内部包含了一个测试引擎,用于在Junit Platform上运行
  • Junit Vintage :由于Junit发展多年,为了照顾老的项目,Junit Vintage提供了兼容Junit4和Junit3的测试引擎
  • 更多细节以及使用参见Junit5官网 :JUnit 5
2、SpringBoot对Junit5的支持
  • SpringBoot 2.4及其以上版本移除了默认对Vintage的依赖,如果需要兼容Junit4需要自行引入(不能使用Junit4的测试功能)

    
        org.junit.vintage
        junit-vintage-engine
        test
        
            
                org.hamcrest
                hamcrest-core
            
        
    
    
  • 给出一个SpringBoot测试类的例子

    import org.junit.jupiter.api.Test;// 这里是jupiter包下的,junit4是在org.junit包下
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest //使用该注解后,可以使用自动注入(@Autowried)等功能
    class DataMainApplicationTests {
    
        @Test//junit5的测试注解,并不是Junit4里面的@Test注解了
        void contextLoads() {
    
        }
    }
    
  • 使用Junit5测试框架的前提肯定是要导入junit启动器啦

    
        org.springframework.boot
        spring-boot-starter-test
        test
    
    
3、Junit5中的常用注解
注解描述
@Test表示方法是测试方法,与Junit4不同,功能单一不能声明任何属性,由Jupiter提供额外测试
@ParameterizedTest表示方法是参数化测试
@RepeatedTest表示方法可以重复执行,参数指定重复执行次数
@DisplayName为测试类或者测试方法设置展示名称
@Beforeach表示在每个单元测试之前执行
@AfterEach表示在每个单元测试之后执行
@BeforeAll表示在所有单元测试之前执行
@AfterAll表示在所有单元测试之后执行
@Tag表示单元测试类别
@Disabled表示测试类或测试方法不执行
@Timeout表示测试方法运行如果超过了指定时间将会返回错误
@ExtendWith为测试类或测试方法提供扩展类引用
4、Junit5中的断言(assertions)
  • 断言(assertions)是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是 org.junit.jupiter.api.Assertions 类的静态方法,对于断言:检查业务逻辑返回的数据是否合理,所有的测试运行结束以后,会有一个详细的测试报告

  • 简单断言:用来对单个值进行简单的验证

    方法描述
    asserEquals判断两个对象或两个原始类型是否相等
    assertNotEquals判断两个对象或两个原始类型是否不相等
    assertSame判断两个独享引用是否指向同一个对象
    assertNotSame判断连个对象引用是否指向不同的对象
    aeertTrue判断给定的布尔值是否为true
    assertFalse判断给定的布尔值是否为false
    assertNull判断给定的对象引用是否为null
    assertNotNull判断给定的对象引用是否不为null
    • 例子:asserEquals

      @Test
      public void test1(){
          //参数一:期望的值 参数二:实际执行的值 参数三:不同的构造器,可以设置提示信息
          assertEquals(1,3,"预期和实际执行后的对象或基本数据类型是不相等");
      	// 注意:若含有多个断言方法,中间有任何断言方法报出提示信息,后面的断言将不再执行
      }
      
  • 数组断言(assertArrayEquals)

    @Test
    @DisplayName("array assertion")
    public void array() {
        //通过assertArrayEquals() 方法来判断两个对象或原始类型的数组是否相等
     	assertArrayEquals(new int[]{1, 2}, new int[] {1, 2});
    }
    
  • 组合断言(assertAll)

    @Test
    public void test2(){
        // assertAll() 方法接收多个org.junit.jupiter.api.Executable函数式接口的实例
        //作为要验证的断言,可以通过lambda表达式很容易就提供这些断言
       	assertAll(
             "组合断言",
             () -> assertEquals(2,1 + 1),//使用lambda表达式
             () -> assertNotEquals(2,1 + 1)
       );
    }
    
  • 异常断言(assertThrows)

    @Test
    @DisplayName("异常测试")
    public void exceptionTest() {
        //Junit5提供了一种全新的断言方式Assertions.assertThrows(),配合函数式编程就可以使用
        ArithmeticException exception = Assertions.assertThrows(
               //扔出断言异常
                ArithmeticException.class, () -> System.out.println(1 % 0));
    }
    
  • 超时断言(assertTimeout)

    @Test
    @DisplayName("超时测试")
    public void timeoutTest() {
        //如果测试方法时间超过1s将会异常
        Assertions.assertTimeout(Duration.ofMillis(1000), () -> Thread.sleep(500));
    }
    
  • 快速失败(fail()方法)

    @Test
    @DisplayName("fail")
    public void shouldFail() {
    	fail("This should fail");
    }
    
5、前置条件
  • Junit5中的前置条件(assumptions[假设])类似于断言,不同之处在于不满足的断言会使得测试方法失败,而不满足的前置条件只会使得测试方法的执行终止。前置条件可以看成是测试号方法执行的前提,当该前提不满足时,就没有继续执行的必要了

    @Test
    @DisplayName("前置条件")
    public void test3(){
        Assumptions.assumeTrue(true,"断言信息");//assumeTrue : 期望值true
        Assumptions.assumeFalse(false,"前置条件为false");//assumeFalse : 期望值为false
        System.out.println("若前置条件失败,我不会输出");
    }
    
6、嵌套测试