Java 使用Maven Surefire插件批量运行单元测试
在基于Maven的Java项目中可以使用Maven 的 mvn test
命令来运行单元测试。
示例
有一个简单的Maven 项目, pom.xml 只导入了JUnit 5 的相关依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.osxm.test.javaut</groupId>
<artifactId>java-unittest</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<junit.jupiter.version>5.11.0</junit.jupiter.version>
<junit.platform.version>1.9.3</junit.platform.version>
</properties>
<dependencies>
<!-- JUnit Jupiter API for writing tests -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<!-- JUnit Jupiter Engine for executing tests -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<!-- (Optional) Only required to run tests in an IDE
without built-in support for JUnit 5 -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>${junit.platform.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
这里有一个简单的斐波那契数列的函数:
/**
* Copyright (C) Oscar Chen(XM):
*
* Date: 2024-10-30
* Author: XM
*/
package com.osxm.test.ut;
public class Fibonacci {
public static int fibonacci(int n) {
if (n <= 1) {
return n;
}
int a = 0, b = 1, c;
for (int i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return b;
}
}
针对此数列,写了一个单元测试类:
/**
* Copyright (C) Oscar Chen(XM):
*
* Date: 2024-10-30
* Author: XM
*/
package com.osxm.test.ut;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
public class FibonacciTest {
@Test
public void testFibonacci_bound() {
assertEquals(0, Fibonacci.fibonacci(0));
assertEquals(1, Fibonacci.fibonacci(1));
}
@Test
public void testFibonacci() {
assertEquals(1, Fibonacci.fibonacci(2));
assertEquals(2, Fibonacci.fibonacci(3));
assertEquals(3, Fibonacci.fibonacci(4));
assertEquals(5, Fibonacci.fibonacci(5));
assertEquals(8, Fibonacci.fibonacci(6));
assertEquals(13, Fibonacci.fibonacci(7));
}
}
该测试类可以在IDE中直接运行, 以VS Code的运行为例,可以直接点击测试方法前面的按钮运行:
如果需要在命令行运行要怎么进行呢? 如果要批量运行测试怎么进行呢? 答案就是Maven 的命令 mvn test
。
运行的结果如下:
这里会显示成功、失败、错误和跳过的数量, 除了控制台显示,在target\surefire-reports 目录下还产生了 .txt 和 .xml 的统计文件, 内容类似:
是什么在运行单元测试呢?
在Maven中用于运行单元测试的插件称为 Maven Surefire。
Maven Surefire插件是一个用于执行Java单元测试的强大工具,它集成在Maven构建系统中,为开发人员提供了自动化测试执行、详细的测试结果报告以及灵活的配置选项。
Maven Surefire基本概念
Maven Surefire插件(maven-surefire-plugin)是Maven项目中的一个常用插件,主要用于在Maven构建生命周期的test阶段执行单元测试。它支持多种Java测试框架,如JUnit和TestNG,使得开发人员可以根据自己的需求选择合适的测试框架进行单元测试。
Maven Surefire主要特点
- 自动化测试执行:Maven Surefire插件可以在构建过程中自动执行测试,无需手动运行测试用例,从而提高了测试效率。
- 支持多种测试框架:该插件支持JUnit、TestNG等常见的Java测试框架,为开发人员提供了更多的选择。
- 并行执行测试:Maven Surefire插件支持并行执行测试用例,可以显著缩短测试时间,提高构建效率。
- 详细的测试结果报告:插件生成详细的测试结果报告,包括测试用例的执行结果、耗时、失败原因等信息,方便开发人员进行问题定位和分析。
- 灵活的配置选项:Maven Surefire插件提供了丰富的配置选项,可以根据项目需求进行定制,如指定要执行的测试类、排除某些测试类、设置超时时间等。
Maven Surefire使用方法
-
在pom.xml中配置插件:
- 首先,需要在项目的pom.xml文件中添加Maven Surefire插件的依赖配置。
- 配置插件时,可以根据需要设置各种参数,例如测试源码路径、测试框架等。
-
运行测试用例:
- 通过在命令行中执行相应的Maven命令来运行测试用例。例如,使用“mvn test”命令可以运行项目中的所有单元测试。
- 插件会自动扫描测试类目录下(默认为src/test/java/)的测试类,并执行符合命名约定的测试方法。
Maven Surefire配置示例
以下是一个简单的Maven Surefire插件配置示例:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>最新版本号</version>
<configuration>
<!-- 配置插件参数,如并行执行测试、指定测试类等 -->
<parallel>methods</parallel>
<threadCount>10</threadCount>
<!-- 其他配置参数 -->
</configuration>
</plugin>
</plugins>
</build>
在配置中,可以根据需要设置并行执行测试的参数(如parallel和threadCount),以及其他自定义参数。
注意事项
- 版本兼容性:确保Maven Surefire插件的版本与Maven和测试框架的版本兼容。
- 测试类命名约定:默认情况下,Maven Surefire插件会自动执行测试源码路径下所有符合命名约定的测试类(如以Test开头或结尾的Java类)。如果需要自定义包含和排除模式,可以使用ant风格表达式或正则表达式进行配置。
- 跳过测试和忽略测试:在特定情况下,可能需要跳过测试或忽略某些测试。这可以通过在pom.xml中配置skipTests或testFailureIgnore参数来实现,也可以在测试方法上使用@Ignore注解来忽略单个测试。
Maven Surefire 需要配置吗?
maven-surefire-plugin
是 Maven 的内置插件之一,用于执行单元测试。默认情况下,当你运行mvn test
命令时,Maven 会自动使用maven-surefire-plugin
来运行你的测试代码,而无需显式地在pom.xml
文件中进行配置。
maven-surefire-plugin
默认会查找项目中的测试类,这些测试类通常位于src/test/java
目录下,并且类名应该以Test
结尾(这是 JUnit 的命名约定,但 Maven 的插件实际上更灵活,可以通过配置来指定不同的命名模式)。
如果你没有为maven-surefire-plugin
提供任何自定义配置,Maven 将使用插件的默认设置来运行测试。这包括:
- 查找并运行所有符合命名约定的测试类。
- 生成测试报告,通常位于
target/surefire-reports
目录下。 - 根据测试结果生成构建的成功或失败状态。
然而,尽管默认配置通常足够,但有时候你可能需要自定义maven-surefire-plugin
的行为。例如,你可能想要:
- 排除某些测试类或方法。
- 包含不符合默认命名约定的测试类。
- 更改测试报告的格式或位置。
- 设置并行执行测试以提高构建速度。
- 配置其他与测试执行相关的选项。
在这些情况下,你可以在pom.xml
文件中为maven-surefire-plugin
提供自定义配置。例如:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version> <!-- 使用你需要的具体版本号 -->
<configuration>
<!-- 在这里添加你的自定义配置 -->
<includes>
<include>**/MySpecialTest.java</include>
</includes>
<excludes>
<exclude>**/SlowTest.java</exclude>
</excludes>
<parallel>methods</parallel> <!-- 并行执行测试方法 -->
<!-- 其他配置选项 -->
</configuration>
</plugin>
</plugins>
</build>
总结
- Maven中使用
mvn test
运行测试 - Maven中用于运行单元测试的插件称为 Maven Surefire
- Maven Surefire不需要显示配置, 如果需要进阶使用,可以进行配置