三、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),我们将立即处理