点击“蓝色字”,关注我们哦!!
单元测试就用 JUnit 5!好用到飞起!
单元测试是程序员的“护身符”,写代码不测就像闭着眼睛过马路,迟早翻车。
而 JUnit 5 就是那个帮你保命的工具。
它功能强、扩展性好,用起来特别顺手。
今天咱们就来聊聊 JUnit 5 的那些事儿,写代码、识问题、找优化,全部安排上!
先动手写个简单测试
一上来,不废话,直接来段代码。
java
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class CalculatorTest {
@Test
void add_shouldReturnCorrectSum() {
Calculator calc = new Calculator();
int result = calc.add(2, 3);
assertEquals(5, result, "加法结果不对啊!");
}
}
这段代码干啥?
定义了一个测试类 CalculatorTest
。写了一个 单元测试方法 add_shouldReturnCorrectSum
,用来测add
方法。最后用 assertEquals
检查结果是不是 5。
回头跑一下,是不是超简单?但是别高兴太早!
实践中可能遇到的问题
问题1:测试方法写了,但忘了加注解!
很多人写完测试就是一顿猛跑,结果啥都没测出来,原因是忘了加 @Test
。
解决方法: 养成习惯,写完方法就加 注解,别偷懒!
问题2:测试⽤例不够全面!
看上面代码,测了 add
方法,但是如果 两个负数相加 呢?
再比如,大整数溢出 怎么办?测了吗?没测!就容易出问题。
优化建议: 多考虑边界情况,别怕麻烦,多加几个测试用例。
java
@Test
void add_shouldHandleNegativeNumbers() {
Calculator calc = new Calculator();
int result = calc.add(-2, -3);
assertEquals(-5, result, "负数加法结果不对!");
}
@Test
void add_shouldHandleIntegerOverflow() {
Calculator calc = new Calculator();
int result = calc.add(Integer.MAX_VALUE, 1);
assertTrue(result <; 0, "溢出处理失败!");
}
看,这样一来,测试就更全面了!
问题3:代码改了,测试没跟上!
开发中,代码经常改,逻辑变了,测试代码还停留在老版本。
结果一跑测试,直接 一片红,还不知道错在哪。
优化建议: 跟着代码逻辑走,改完业务代码,别忘了更新测试。
再深入:断言用法有啥讲究?
JUnit 5 的断言工具特别多,别老用 assertEquals
,试试其它的:
1. 检查是否为真
java
@Test
void isAdult_shouldReturnTrueForAgeAbove18() {
Person person = new Person(20);
assertTrue(person.isAdult(), "20岁应该是成年人吧?");
}
2. 检查是否抛异常
有时候,我们需要确认某个方法会不会抛异常,比如除以 0:
java
@Test
void divide_shouldThrowExceptionForZero() {
Calculator calc = new Calculator();
assertThrows(ArithmeticException.class, () ->; calc.divide(10, 0), "除以零没抛异常?");
}
3. 多条件检查
比如返回结果是一个数组,直接用 assertArrayEquals
:
java
@Test
void sort_shouldReturnSortedArray() {
int[] input = {3, 1, 2};
int[] expected = {1, 2, 3};
assertArrayEquals(expected, sorter.sort(input), "排序结果不对啊!");
}
参数化测试,省时又省力!
写测试最烦的就是 重复劳动,同一个方法,不同输入,得写一堆测试。
用 JUnit 5 的 参数化测试,就能省不少事儿。
java
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
class CalculatorTest {
@ParameterizedTest
@CsvSource({
"2, 3, 5",
"-2, -3, -5",
"0, 5, 5"
})
void add_shouldReturnCorrectSum(int a, int b, int expected) {
Calculator calc = new Calculator();
assertEquals(expected, calc.add(a, b), "加法结果不对!");
}
}
这段代码厉害在哪?
用了 @ParameterizedTest
和@CsvSource
。一口气测了 3 种输入,还不用写 3 个方法!
是不是效率高得离谱?
提升效率:测试组织和运行技巧
1. 测试分组
如果项目里有上百个测试,想分类跑怎么办?
JUnit 5 提供了 标签功能,用 @Tag
给测试分组:
java
@Tag("fast")
@Test
void fastTest() {
// 快速测试
}
@Tag("slow")
@Test
void slowTest() {
// 慢速测试
}
运行时,通过命令指定标签:
bash
2. 并行测试
项目变大后,测试时间越来越长。
JUnit 5 自带并行运行功能,跑起来更快!
只需要在配置文件 junit-platform.properties
里加一行:
properties
junit.jupiter.execution.parallel.enabled=true
总结
JUnit 5 是个超级好用的单元测试框架,用熟了真能省不少时间。
从 基础断言 到 参数化测试,再到 并行运行,功能全到飞起。
写代码别怕测试麻烦,不测才是大麻烦!
欢迎大家在评论里交流,代码问题一起探讨,别自己憋着!
点它,分享点赞在看都在这里