单元测试

发布时间 2024-01-05 15:57:54作者: GradyYoung

Java中的JUnit单元测试

Java原生并没有提供单元测试的方法,一般的简单测试使用main方法进行测试,但是如果对于复杂的测试,则需要使用第三方框架来实现,例如JUnit框架

官网:https://junit.org/junit5/

JUnit5 的组成:JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

JUnit5 建议使用 Java8 及以上版本

  • JUnit Platform 是在 JVM 上启动测试框架的基础,它定义了TestEngine在平台运行的新测试框架的 API
  • JUnit Jupiter 它用于编写测试代码的新的编程和扩展模型。它具有所有新的 Junit 注释和TestEngine实现来运行这些注释编写的测试。
  • JUnit Vintage JUnit4 已经存在了很长时间,并且有许多以 JUnit4 编写的测试。JUnit Jupiter 还需要支持这些测试。为此,开发了 JUnit Vintage 子项目。提供了一个测试引擎,用于在平台上运行基于 JUnit 3 和 JUnit 4 的测试。它要求 JUnit 4.12 或更高版本出现在类路径或模块路径中。从它的名字 Vintage(古老的)中也能有所体会。

4和5的区别

JUnit4

  • @Test的包是org.junit.Test
  • 需要@RunWith(SpringRunner.class)
  • 测试类和测试方法需要public修饰

JUnit5

  • @Test的包是org.junit.jupiter.api.Test
  • 不需要@RunWith(SpringRunner.class)
  • 测试类和测试方法不需要public修饰

SE项目不同IDE的使用

  • Eclipse

    • 选中当前工程,右键选择:build path - add libraries - JUnit 4 - 下一步
    • 创建Java类,进行单元测试。
    • 此类中声明单元测试方法。
    • 此单元测试方法上需要声明注解:@Test,并在单元测试类中导入:import org.junit.Test;
    • 声明好单元测试方法以后,就可以在方法体内测试相关的代码。
    • 写完代码以后,左键双击单元测试方法名,右键:run as - JUnit Test
  • IDEA

    • 在代码空白位置右键,Generate,Test

      • Testing library选择Junit版本
      • Class name输入测试类名称
      • Destination packages选择测试类的包
      • Member选择要要测试的方法
    • OK

注解

Annotations 描述
@BeforeEach 在方法上注解,在每个测试方法运行之前执行。
@AfterEach 在方法上注解,在每个测试方法运行之后执行
@BeforeAll 该注解方法会在所有测试方法之前运行,该方法必须是静态的。
@AfterAll 该注解方法会在所有测试方法之后运行,该方法必须是静态的。
@Test 用于将方法标记为测试方法
@DisplayName 用于为测试类或测试方法提供任何自定义显示名称
@Disable 用于禁用或忽略测试类或方法
@Nested 用于创建嵌套测试类
@Tag 用于测试发现或过滤的标签来标记测试方法或类
@TestFactory 标记一种方法是动态测试的测试工场

常用测试方式

普通测试

@Test
void testDemo() {
}

重复性测试

@RepeatedTest(5)
void testDemo(TestInfo testInfo,RepetitionInfo repetitionInfo){

  System.out.println("repeat:" + testInfo.getDisplayName());
  System.out.println("这是第 "+ repetitionInfo.getCurrentRepetition()+ "次重复");

}

参数测试

@ParameterizedTest
@ValueSource(strings = {"java", "python", "go"})
void testDemo(String candidate) {
    assertTrue(candidate.contains("o"));
}

超时测试

@Test
@Timeout(value = 500, unit = TimeUnit.MILLISECONDS)
void testDemo() {
    // fails if execution time exceeds 500 milliseconds
}