没有理想的人不伤心

单元测试框架 - JUnit

2025/08/29
3
0

image.png

JUnit 是 Java 领域最流行的单元测试框架,用于编写和运行可重复的测试,帮助开发者验证代码的正确性。它支持自动化测试、测试用例组织、测试结果断言等功能,是敏捷开发和持续集成中的核心工具。

JUnit 框架的核心特点

  1. 注解驱动:通过注解(如 @Test )标记测试方法,简化测试代码编写。
  2. 断言机制:提供丰富的断言方法,验证实际结果与预期结果是否一致。
  3. 测试生命周期管理:通过 @BeforeEach @AfterEach 等注解控制测试方法的执行时机。
  4. 测试套件:支持将多个测试类组合成测试套件,批量执行。
  5. 兼容性:JUnit 有多个版本,目前主流是 JUnit 5(支持 Java 8+),兼容 JUnit 4 的部分语法。

JUnit 常用注解(JUnit 5)

注解 作用
@Test 标记一个测试方法
@BeforeEach 每个测试方法执行前运行(初始化资源)
@AfterEach 每个测试方法执行后运行(释放资源)
@BeforeAll 所有测试方法执行前运行(静态方法)
@AfterAll 所有测试方法执行后运行(静态方法)
@Disabled 禁用某个测试方法或类
@DisplayName 为测试方法或类设置可读性名称
@ParameterizedTest 参数化测试,支持多组输入数据

常用断言方法(org.junit.jupiter.api.Assertions

断言方法用于验证代码执行结果是否符合预期,若断言失败则测试用例报错。

  1. 基础断言

    • assertEquals(expected,actual):验证两个值相等(支持所有基本类型、对象、集合等)。
      assertEquals(4,2 + 2);  // 成功
      assertEquals("hello", "hel" + "lo");  // 成功
      
    • assertNotEquals(unexpected,actual):验证两个值不相等。
    • assertTrue(condition):验证条件为 true
      assertTrue(list.isEmpty());  // 验证集合为空
      
    • assertFalse(condition):验证条件为 false
    • assertNull(actual):验证对象为 null
    • assertNotNull(actual):验证对象不为 null
  2. 数组/集合断言

    • assertArrayEquals(expectedArray,actualArray):验证两个数组内容相等。
      int[] expected = {1,2,3};
      int[] actual = {1,2,3};
      assertArrayEquals(expected,actual);  // 成功
      
    • 对于集合,可直接用 assertEquals(需集合实现 equals 方法,如 ListSet)。
      List<Integer> expected = Arrays.asList(1,2,3);
      List<Integer> actual = Arrays.asList(1,2,3);
      assertEquals(expected,actual);  // 成功
      
  3. 异常断言

    • assertThrows(expectedException,executable):验证执行代码时抛出指定异常。
      // 验证空指针异常
      assertThrows(NullPointerException.class, () -> {
          String str = null;
          str.length();
      });
      
  4. 超时断言

    • assertTimeout(duration,executable):验证代码在指定时间内执行完成。
      // 验证代码在 1 秒内执行完
      assertTimeout(Duration.ofSeconds(1), () -> {
          Thread.sleep(500);  // 执行耗时 500ms,成功
      });
      
  5. 自定义错误信息
    所有断言方法都支持最后添加一个字符串参数,作为断言失败时的提示信息:

    assertEquals(4,2 + 1, "2+1 的结果应该是 3,但实际计算错误");
    

简单示例

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class CalculatorTest {
    private Calculator calc = new Calculator();

    @Test
    @DisplayName("测试加法运算")
    void testAdd() {
        int result = calc.add(2,3);
        assertEquals(5,result, "2+3 应该等于 5");
    }

    @Test
    @DisplayName("测试除法异常")
    void testDivideByZero() {
        assertThrows(ArithmeticException.class, () -> {
            calc.divide(10,0);
        }, "除以 0 应该抛出算术异常");
    }
}

总结

JUnit 框架通过注解和断言机制,让开发者能够快速编写可靠的单元测试。合理使用断言方法可以覆盖各种测试场景(正常逻辑、边界条件、异常情况等),确保代码在修改或重构后仍能保持正确性。对于复杂测试场景,还可以结合参数化测试(@ParameterizedTest)、测试套件等高级功能。