# 写在前面

从去年开始,就没静下心来去写点东西了。今天来叨叨一下单元测试。

这篇文章,算我是心血来潮想重新开始写点什么的开始。虽然不知道下篇会说些什么,那就直接进入正题吧。

JUnit.

写 Java 的同学对这个 JUnit 肯定是熟悉的。嗯,大概也就是熟悉 @Test .

本着务实的态度,作为 JUnit 的第一篇文章,先不说 JUnit 的辉煌历史。兵出奇招,直接看 JUnit 5.

# JUnit 5

JUnit 5 不是 JUnit 5.x 版本。JUnit 5 其实是 Junit 的一个代号,可以理解为 JUnit 的第 5 代。

JUnit 5 有三个组件 JUnit Platform , JUnit Jupiter , JUnit vintage .

本篇重点: JUnit Jupiter.

# JUnit Jupiter

截止今日 (2024 年 8 月 6 日), JUnit Jupiter 最新版本 5.10.3. 所以

1
2
3
4
5
6
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.3</version>
<scope>test</scope>
</dependency>

# 最佳食用姿势

# @Test

1
2
3
4
5
@Test
public void testSumEqual() {
// 断言
Assertions.assertEquals(1, 2);
}

输出内容是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
org.opentest4j.AssertionFailedError: 
Expected :1
Actual :2
<Click to see difference>


at org.junit.jupiter.api.AssertionFailureBuilder.build(AssertionFailureBuilder.java:151)
at org.junit.jupiter.api.AssertionFailureBuilder.buildAndThrow(AssertionFailureBuilder.java:132)
at org.junit.jupiter.api.AssertEquals.failNotEqual(AssertEquals.java:197)
at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:150)
at org.junit.jupiter.api.AssertEquals.assertEquals(AssertEquals.java:145)
at org.junit.jupiter.api.Assertions.assertEquals(Assertions.java:531)
at com.fxb.ut.JUnitTestCase.testSumEqual(JUnitTestCase.java:10)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.util.ArrayList.forEach(ArrayList.java:1259)
at java.util.ArrayList.forEach(ArrayList.java:1259)

# @BeforeAll

使用 @BeforeAll 可以在单元测试前初始化部分信息。
@BeforeAll 只能使用在静态方法上,被注解的方法会在测试开始前运行一次。

1
2
3
4
5
6
7
8
9
10
11
public static int num1 = 0;

@BeforeAll
public static void init() {
num1 = 2;
}

@Test
public void showBeforeAllTest(){
Assertions.assertEquals(2, num1); // 通过
}

# @BeforeEach

在每个用例执行前执行一次。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

@BeforeEach
public void beforeEachTest(){
System.out.println("执行case:");
}

@Test
@DisplayName("演示BeforeEach - 1")
public void showBeforeEachTest1(){
System.out.println(" => case1");
}


@Test
@DisplayName("演示BeforeEach - 2")
public void showBeforeEachTest2(){
System.out.println(" => case2");
}

输出结果

1
2
3
4
执行case:
=> case1
执行case:
=> case2

# @AfterAll

@AfterAll 注解只能使用在静态方法上,被注解的方法会在所有单元测试运行完毕后运行一次。

# @AfterEach

使用 @AfterEach 注解的方法,会在每一个 @Test 注解的方法运行结束前运行一次。

# @Disabled

被 @Disabled 注解的方法不在参与测试。

# @DisplayName

使用 @DisplayName 注解可以自定义测试方法的显示名称,下面为两个测试方法自定义名称。

# @Order

在类上增加注解 @TestMethodOrder ,然后在方法上使用 @Order 指定顺序,数字越小优先级越搞,可以保证测试方法运行顺序。

# 断言

  • Assertions.assertNotNull(xx) : 检测不为空
  • Assertions.assertEquals(expect, actual) : 判断是否相等
  • Assertions.assertNotEquals(expect, actual) : 判断是否不相等.
  • Assertions.assertTrue(boolean) : 判断是否正确
  • Assertions.assertFalse(boolean) : 判断是否错误.

好啦,今天就到这里吧。知道这几个注解就能应对你工作中 30% 的问题,超过 90% 的 java 程序员啦。
因为有 91% 的 java 程序员都不写单元测试。虽然他们都知道如何写,就像写这篇文章的人.

对了, 那 1% 就是不写单元测试,也不会有 bug 的人。

# 最后

希望和你一起遇见更好的自己

更新于 阅读次数

请我喝[咖啡]~( ̄▽ ̄)~*

方小白 微信支付

微信支付

方小白 支付宝

支付宝

方小白 numberpay

numberpay