一. 关于Junit5
Java 语言的单元测试框架相对统一,JUnit 和TestNG 几乎始终处于市场前两位。其中 JUnit 以较长的发展历史和源源不断的功能演进,得到了大多数用户的青睐;
Junit5 由 JUnit Platform + JUnit Jupiter + JUnit Vintage3 部分构成,借用 IBM Developer 的一张图来说明 JUnit 5 的架构 :
JUnit Platform :
其主要作用是在 JVM 上启动测试框架。它定义了一个抽象的 TestEngine API 来定义运行在平台上的测试框架;也就是说其他的自动化测试引擎或开发人员自己定制的引擎都可以接入 Junit 实现对接和执行。同时还支持通过命令行、Gradle 和 Maven 来运行;
JUnit Jupiter :
这是 Junit5 的核心,可以看作是承载 Junit4 原有功能的演进,包含了 JUnit 5 最新的编程模型和扩展机制;很多丰富的新特性使 JUnit ⾃动化测试更加方便、功能更加丰富和强大。也是测试需要重点学习的地方;Jupiter 本身也是⼀一个基于 Junit Platform 的引擎实现,对 JUnit 5 而言,JUnit Jupiter API 只是另一个 API;
JUnit Vintage :
Junit 发展了10数年,Junit 3 和 Junit 4 都积累了大量的⽤用户,作为新一代框 架,这个模块是对 JUnit3,JUnit4 版本兼容的测试引擎,使旧版本 junit 的⾃动化测试脚本也可以顺畅运行在 Junit5 下,它也可以看作是基于 Junit Platform 实现的引擎范例;
JUnit 5 对 Java 运行环境的最低要求是 Java 8;
二. Junit使用
2.1 添加Maven依赖
我们在操作 Junit 的时候要添加相应的依赖,可以去Maven仓库自行下载,这里给出一段代码:
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.9.1</version> </dependency>
2.2 注解
1)Test
表示方法是测试方法,与Junit4的@Test不同,不能声明任何属性,因为JUnit Jupiter中的测试扩展需要通过专用的注解;
public class Junit_Test { @Test void Test01(){ System.out.println("测试用例1"); } @Test void Test02(){ System.out.println("测试用例2"); } }
2)Disable
用于禁用一个测试类或测试方法;类似于JUnit 4的' @Ignore '。即执行单元测试时,会忽略对应的测试类或者测试方法;
public class Junit_Test { @Test void Test01(){ System.out.println("测试用例1"); } @Test void Test02(){ System.out.println("测试用例2"); } @Disabled void Test03(){ System.out.println("测试用例3"); } }
3) BeforeAll 和 AfterAll
BeforeAll:表示方法在所有测试方法之前运行;
AfterAll:表示方法在所有测试方法之后运行;
public class Junit_Test { @AfterAll // 需要添加一个关键字static,是针对这个类的 static void Test05(){ System.out.println("测试用例AfterAll"); } @Test void Test01(){ System.out.println("测试用例1"); } @Test void Test02(){ System.out.println("测试用例2"); } @Disabled void Test03(){ System.out.println("测试用例3"); } @BeforeAll // 需要添加一个关键字static,是针对这个类的 static void Test04(){ System.out.println("测试用例BeforeAll"); }
针对这个操作,通常情况下,创建驱动,打开网页,都放到BeforeAll里面,关闭浏览器放到AfterAll里;
4)BeforeEach 和 AfterEach
BeforeEach:表示方法应该在当前类中每个 @Test, @RepeatedTest, @ParameterizedTest 或 @TestFactory 方法之前执行;类似于Junit4的@Before 。即在每个单元测试之前执行,如果测试类有n个测试方法,则被执行n次;
AfterEach:
表示方法应该在当前类中每个 @Test, @RepeatedTest, @ParameterizedTest 或 @TestFactory 方法之后执行;类似于Junit4的@After 。即在每个单元测试之后执行,如果测试类有n个测试方法,则被执行n次;
public class Junit_Test { @AfterAll // 需要添加一个关键字static,是针对这个类的 static void Test05(){ System.out.println("测试用例AfterAll"); } @Test void Test01(){ System.out.println("测试用例1"); } @Test void Test02(){ System.out.println("测试用例2"); } @Disabled void Test03(){ System.out.println("测试用例3"); } @BeforeAll // 需要添加一个关键字static,是针对这个类的 static void Test04(){ System.out.println("测试用例BeforeAll"); } @BeforeEach void Test06(){ System.out.println("测试用例BeforeEach"); } @AfterEach void Test07(){ System.out.println("测试用例AfterEach"); } }
5)ParameterizedTest
表示方法是参数化测试,这里我们需要引入对应的依赖,这里和Junit的版本保持一致:
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <version>5.9.1</version> <scope>test</scope> </dependency>
@ParameterizedTest // 传入整形参数 @ValueSource(ints = {1,2,3}) void Test08(int num){ System.out.println(num); } @ParameterizedTest // 传入字符串 @ValueSource(strings ={"1","2","3"}) void Test09(String nums){ System.out.println(nums); }
CSV获取参数:
@ParameterizedTest @CsvFileSource(resources = "test01.csv") void Test10(String name){ System.out.println(name); }
方法获取参数,可传入不同类型的参数:
// 通过方法名获取参数 @ParameterizedTest @MethodSource("method") void Test11(int num, String name) { System.out.println(num + ":" + name); } // 输出不同类型的参数 public static Stream<Arguments> method() { return Stream.of(Arguments.arguments(1, "张三"), Arguments.arguments(2, "李四"), Arguments.arguments(3, "王五")); }
6)TestMethodOrder
按照指定顺序来执行测试用例
// 按照指定顺序 //@TestMethodOrder(MethodOrderer.OrderAnnotation.class) // 按照随机顺序 @TestMethodOrder(MethodOrderer.Random.class) public class Junit_Test1 { // 第三个执行 @Order(3) @Test void Test01() { System.out.println("测试用例1"); } // 第一个执行 @Order(1) @Test void Test02() { System.out.println("测试用例2"); } // 第二个执行 @Order(2) @Test void Test03() { System.out.println("测试用例3"); } }
2.3 断言
断言(assertions)是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是 orgjuiit.jupiter.api.Assertions的静态方法。JUnit5内置的断言可以分成如下几个类别:检查业务逻辑返回的数据是否合理;
1)assertEquals :判断两个对象或两个原始类型是否相等
@ParameterizedTest @ValueSource(ints = {1}) void Test04(int num){ // 第一个参数是预期的,第二个参数是实际的 Assertions.assertEquals(1,num); System.out.println(num); }
2)assertNotEquals:判断两个对象或两个原始类型是否不相等
@ParameterizedTest @ValueSource(ints = {1}) void Test04(int num){ // 第一个参数是预期的,第二个参数是实际的 // 判断是否相等 //Assertions.assertEquals(1,num); // 判断不相等 Assertions.assertNotEquals(2,num); System.out.println(num); }
3)assertSame:判断两个对象引用是否指向同一个对象
@ParameterizedTest @ValueSource(ints = {1}) void Test04(int num) { // 判断是否指向同一个对象 Object obj1 = new Object(); Object obj2 = new Object(); Assertions.assertSame(obj1, obj2, "不是同一个对象"); }
4)assertNotNull:判断给定的对象引用是否不为null
@ParameterizedTest @ValueSource(ints = {1}) void Test04(int num){ // 判断是否为空 String str = null; Assertions.assertNull(str); }
2.4 套件
使用 JUnit5 测试套件,您可以运行分散到多个测试类和不同包中的测试;
1)SelectClasses指定通过class运行测试套件时要选择的类
@Suite // 先执行Junit_Test.class,再执行Junit_Test1.class @SelectClasses({Junit_Test.class,Junit_Test1.class}) public class RunSuite { }
1)SelectPackages指定通过包运行测试套件时要选择的类
@Suite @SelectPackages(value = {"Pack1","Pack2"}) public class RunSuite { }
到这里关于Junit常用的操作就介绍完了,有问题的小伙伴可以私信我,感觉有帮助的,希望可以留下你们的小赞~~