junit 5单元测试(二)-爱代码爱编程
前言
上一篇讲了 JUnit 5单元测试(一),书接上文开始 JUnit 5单元测试(二)
一、单元测试规范和操作
1.单元测试的类名应该起为 xxxxTest.java 表明这个一个测试类,类名应该用简洁的英文表明测试内容或函数。
- 例如:为了测试一个计算和的方法,可以取名为 SumTest.java
2.测试方法上应该加上 @Test 注解以表明其是一个测试方法。
-
运行测试方法:在 idea 中每个测试方法前都有一个运行按钮,点击后会运行该测试方法。
-
运行测试类:在 idea 中在测试类的类名前面有一个运行按钮,点击后会运行当前测试类中所有的测试方法。
3.使用 surefire 运行所有单元测试并生成报告。
-
你可能会有很多单元测试类放在了 test/java/ 文件夹下,你可以在 idea 中右侧maven页签中的 Lifecycle 下双击 test ,将会帮你运行所有的单元测试,每个单元测试类都会在 target/surefire-reports 下生成 txt 报告,里面有当前单元测试类的执行成功、失败、跳过、耗时等信息。
-
生成 txt 报告后,如果你不想一个个去看每个测试类生成的 txt 报告,可以在 idea 的 Terminal 命令行窗口输入
mvn surefire-report:report
命令执行,它会读取所有 txt 报告在 target/site/ 下生成 surefire-reports.html 文件,用浏览器打开该文件你就可以直观的看到所有单元测试类的所有执行情况。
二、JUnit5提供的注解
注解 | 描述 |
---|---|
@BeforeEach | 在方法上注解,在每个测试方法运行之前执行。 |
@AfterEach | 在方法上注解,在每个测试方法运行之后执行 |
@BeforeAll | 该注解方法会在所有测试方法之前运行,该方法必须是静态的。 |
@AfterAll | 该注解方法会在所有测试方法之后运行,该方法必须是静态的。 |
@Test | 用于将方法标记为测试方法 |
@DisplayName | 用于为测试类或测试方法提供说明。(相当于注释) |
@Nested | 用于创建嵌套测试类。(注解在测试类的内部类上) |
@Disable | 用于禁用或忽略测试类或测试方法 |
@Tag | 用于标记测试方法或测试类 |
@TestFactory | 标记一种方法是动态测试的测试工场 |
说明:
@BeforeAll
:使用 @BeforeAll 注解的方法必须是用 static 修饰的,无论是运行某一个测试方法还是运行一个测试类,@BeforeAll 注解的方法都会在所有测试方法执行前运行,并只运行一次。@BeforeEach
:每个测试方法运行之前执行。如果你运行一个测试类,每个测试方法执行前都会先执行一次@BeforeEach注解的方法。@AfterEach
:每个测试方法运行之后执行。如果你运行一个测试类里,每个测试方法执行完后都会执行一次@AfterEach注解的方法。@AfterAll
:使用 @AfterAll 注解的方法必须是用 static 修饰的,无论是运行某一个测试方法还是运行一个测试类,@AfterAll 注解的方法都会在所有测试方法执行完后运行,并只运行一次。@Disable
:当运行一个测试类时被 @Disable 注解的测试方法会被忽略,不会被运行。
三、断言
1.什么是断言
断言就是专门用来验证输出和期望是否一致的一个工具。换句话说断言就是判断一个方法所产生的结果是否符合你期望的那个结果。
例如:如果你写个一个方法 sum( ) 用来计算两个数的和,那现在你想验证下你这个方法计算 1+1 是不是 2,你可以使用assertEquals 断言方法,就像这样 assertEquals(2, sum(1,1)) ,如果 你 sum 方法计算 1+1 后返回的不是 2,那么测试方法断言就失败了这里就会报错提示你;如果返回的就是预期的2,那么久会继续执行 assertEquals 断言后的语句。
2.断言方法
除了上面提到的 assertEquals 断言方法,junt5 还提供了许多其他断言方法。
断言方法 | 说明 |
---|---|
assertEquals(expected, actual) | 如果预期值 expected 不等于实际返回值 actual ,则断言失败。 |
assertTrue(booleanExpression) | 如果 booleanExpression 不是 true ,则断言失败。 |
assertFalse(booleanExpression) | 如果 booleanExpression 不是 false ,则断言失败。 |
assertNull(actual) | 如果 actual 不是 null ,则断言失败。 |
assertNotNull(actual) | 如果 actual 是 null ,则断言失败。 |
assertSame(object1, object2) | 如果两个对象引用没有指向同一个对象,则断言失败 |
assertNotSame(object1, object2) | 如果两个对象引用指向同一个对象,则断言失败 |
assertArrayEquals(object1, object2) | 如果方两个数组不相等,则断言失败 |
示例:
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertTrue;
@DisplayName("断言测试类")
public class AssertTest {
@DisplayName("断言测试方法")
@Test
public void testAssertions() {
String str1 = new String("abc");
String str2 = new String("abc");
String str3 = null;
String str4 = "abc";
String str5 = "abc";
int val1 = 5;
int val2 = 6;
String[] expectedArray = {"one", "two", "three"};
String[] resultArray = {"one", "two", "three"};
assertEquals(str1, str2);
assertTrue(val1 < val2);
assertFalse(val1 > val2);
assertNotNull(str1);
assertNull(str3);
assertSame(str4, str5);
assertNotSame(str1, str3);
assertArrayEquals(expectedArray, resultArray);
}
}
断言都没有失败,运行效果如下: