使用JUnit5进行单元测试及JUnit5的新特性(下)

发表于:2021-3-24 09:20

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:wysghmbb    来源:CSDN

  三、JUnit5新特性总结
  新特性一、@Test注解标记在方法上,JUnit5不需要让方法标记为public
  构建工具和IDE也能识别方法。例如上方代码,若用的junit的包,去掉方法上的public,会报错。
  新特性二、初始化与销毁的注解变化
  在JUnit5中,@Before注解换成了@BeforeEach,@After注解换成了@AfterEach;
  @BeforeClass换成了@BeforeAll,@AfterClass换成了@AfterAll。
  @BeforeAll——只执行一次,方法必须是静态的,因为执行这个时,还没有任何测试实例
  @BeforeEach——每个测试执行前都会执行,方法必须是非静态的
  @AfterAll——只执行一次,方法必须是静态的,因为执行这个时,还没有任何测试实例
  @AfterEach——每个测试执行后都会执行,方法必须是非静态的
  在一个类里执行有@Test注解的方法,且@Test是来自jupiter包,每个注解的加载顺序是:@BeforeAll,@BeforeEach,测试方法,@AfterEach,@AfterAll。带@Before、@After注解的这种junit4里的方法不会执行。
  新特性三、使用@Nested 注解进行嵌套测试
  使用任意嵌套的内部类作为单个测试类中附加的测试组成单元,可以一次性测试多个方法。
  package demo;
  import org.junit.jupiter.api.*;
  public class TestNestedDemo {
      //在所有的测试方法运行前执行
      @BeforeAll
      public static void testBeforeAll(){
          System.out.println("哈哈,我是beforeAll方法");
      }
      //在每个测试方法运行前执行
      @BeforeEach
      public void testBeforeEach(){
          System.out.println("当当,我是beforeEach方法");
      }
      @Nested
      @DisplayName("@Nested注解,测试多个方法")
      class NestedDemo {
          @Test
          public void testAnnotaion2() {
              Assertions.assertTrue(3 == 1 + 1);
          }
          @Test
          public void testAnnotaion3() {
              Assertions.assertEquals("西施","东施","你是假的呀");
          }
      }
  }
  在日志中的打印是这样的:1、哈哈,我是beforeAll方法;2、当当,我是beforeEach方法;3、testAnnotaion2怎么错了;4、当当,我是beforeEach方法、5、你是假的呀 ==> testAnnotaion3怎么错了。
  新特性四、@Disabled注解进行失效校验
  @Disabled注解相当于junit包里的@Ignore注解。
  @Test
          @DisabledOnOs(OS.WINDOWS)
          public void testAnnotaion2() {
              Assertions.assertTrue(3 == 1 + 1);
          }
  在windows操作系统中,上述方法不会执行。
  新特性五、@TestMethodOrder注解定义执行顺序
  和@order注解结合使用,@Order是大于0的正整数,数字越小优先级越高。这样也能够实现多个方法一起测试哦!
  @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
  public class JUnit5Demo {
      @Test
      @Order(2)
      public void btestAdd1(){
          Assertions.assertEquals(3,1+1);
      }
      @Test
      @Order(1)
      public void atestAdd2(){
          Assertions.assertEquals(4,2+1);
      }
  }
  上述代码会先执行方法2再执行方法1,如果去掉@Order注解,也会先执行方法2再执行方法1,因为默认加上的是@TestMethodOrder(MethodOrderer.Alphanumeric.class)注解,会按照方法名的字母来排序。
  后记-学以致用
  例一
  想测试一个题为“给定一个含有n个正整数的数组和一个正整数s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度”的方法,以前都是些main方法,这次用JUnit5来测试一下:
  已知输入:s = 7, nums = [2,3,1,2,4,3],输出:2
  package demo;
  import com.leetcode.D0127p3;
  import org.junit.jupiter.api.Assertions;
  import org.junit.jupiter.api.BeforeAll;
  import org.junit.jupiter.api.Test;
  public class D0127p3Test {
      private static D0127p3 d0127p3;
      @BeforeAll
      static void initD0127p3(){
          d0127p3 = new D0127p3();
      }
      @Test
      void checkResult(){
          int s = 7;
          int[] nums = {2,3,1,2,4,3};
          Assertions.assertEquals(2,d0127p3.minSubArrayLenM1(s,nums));
      }
  }
  运行后没有报错,说明代码写得没问题。
  例二
  想多用几种参数试试,用@Nested注解,注意这个注解的包很容易引错,可以删掉重新引入。
  package demo;
  import com.leetcode.D0127p3;
  import org.junit.jupiter.api.Assertions;
  import org.junit.jupiter.api.BeforeAll;
  import org.junit.jupiter.api.Nested;
  import org.junit.jupiter.api.Test;
  public class D0127p3Test {
      private static D0127p3 d0127p3;
      @BeforeAll
      static void initD0127p3(){
          d0127p3 = new D0127p3();
      }
      @Nested
      class testMethods{
          @Test
          void checkResult(){
              int s = 7;
              int[] nums = {2,3,1,2,4,3};
              Assertions.assertEquals(2,d0127p3.minSubArrayLenM1(s,nums));
          }
          @Test
          void checkResult2(){
              int s = 9;
              int[] nums = {3,3,1,2,4,3};
              Assertions.assertEquals(3,d0127p3.minSubArrayLenM1(s,nums));
          }
      }
  }
  两个方法都执行正确。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号