“Java 单元测试神器 JUnit 5:写得快、测得准、跑得飞起!“

点击“蓝色字”,关注我们哦!!


单元测试就用 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 是个超级好用的单元测试框架,用熟了真能省不少时间。

基础断言参数化测试,再到 并行运行,功能全到飞起。

写代码别怕测试麻烦,不测才是大麻烦!

欢迎大家在评论里交流,代码问题一起探讨,别自己憋着!

点它,分享点赞在看都在这里