使用 Maven 运行单个测试或方法
最后更新:2024年5月11日
1. 概述
通常,我们在 Maven 构建过程中使用 Maven surefire 插件 来执行测试。
本教程将探讨如何使用此插件来运行单个测试类或测试方法。
2. 问题介绍
Maven surefire 插件易于使用。它只有一个目标:test。
因此,使用默认配置,我们可以通过mvn test命令执行项目中的所有测试。
有时,我们可能只想执行单个测试类,甚至单个测试方法。
在本教程中,我们将以 JUnit 5 作为测试提供者示例,来探讨如何实现它。
3. 示例项目
为了更直接地显示测试结果,让我们创建几个简单的测试类
class TheFirstUnitTest {
// declaring logger ...
@Test
void whenTestCase_thenPass() {
logger.info("Running a dummyTest");
}
}
class TheSecondUnitTest {
// declaring logger ...
@Test
void whenTestCase1_thenPrintTest1_1() {
logger.info("Running When Case1: test1_1");
}
@Test
void whenTestCase1_thenPrintTest1_2() {
logger.info("Running When Case1: test1_2");
}
@Test
void whenTestCase1_thenPrintTest1_3() {
logger.info("Running When Case1: test1_3");
}
@Test
void whenTestCase2_thenPrintTest2_1() {
logger.info("Running When Case2: test2_1");
}
}
在TheFirstUnitTest类中,我们只有一个测试方法。然而,TheSecondUnitTest包含四个测试方法。我们所有的 方法名都遵循“when…then…”模式。
为了简单起见,我们让每个测试方法输出一行,表明该方法正在被调用。
现在,如果我们运行mvn test,所有测试都将被执行
$ mvn test
...
[INFO] Scanning for projects...
...
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.baeldung.runasingletest.TheSecondUnitTest
16:58:16.444 [main] INFO ...TheSecondUnitTest - Running When Case2: test2_1
16:58:16.448 [main] INFO ...TheSecondUnitTest - Running When Case1: test1_1
16:58:16.449 [main] INFO ...TheSecondUnitTest - Running When Case1: test1_2
16:58:16.450 [main] INFO ...TheSecondUnitTest - Running When Case1: test1_3
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.065 s - in com.baeldung.runasingletest.TheSecondUnitTest
[INFO] Running com.baeldung.runasingletest.TheFirstUnitTest
16:58:16.453 [main] INFO ...TheFirstUnitTest - Running a dummyTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s - in com.baeldung.runasingletest.TheFirstUnitTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0
[INFO]
...
接下来,让我们告诉 Maven 执行指定的测试。
4. 执行单个测试类
Maven surefire 插件提供了一个test参数,我们可以使用它来指定我们要执行的测试类或方法。
如果我们要执行单个测试类,我们可以执行命令mvn test -Dtest=”TestClassName”。
例如,我们可以将-Dtest=”TheFirstUnitTest”传递给mvn命令,仅执行TheFirstUnitTest类
$ mvn test -Dtest="TheFirstUnitTest"
...
[INFO] Scanning for projects...
...
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.baeldung.runasingletest.TheFirstUnitTest
17:10:35.351 [main] INFO com.baeldung.runasingletest.TheFirstUnitTest - Running a dummyTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.053 s - in com.baeldung.runasingletest.TheFirstUnitTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
...
如输出所示,只有我们传递给test参数的测试类被执行。
5. 执行单个测试方法
此外,我们可以通过将-Dtest=”TestClassName#TestMethodName”传递给mvn命令,要求 Maven surefire 插件执行单个测试方法。
现在让我们执行TheSecondUnitTest类中的whenTestCase2_thenPrintTest2_1()方法
$ mvn test -Dtest="TheSecondUnitTest#whenTestCase2_thenPrintTest2_1"
...
[INFO] Scanning for projects...
...
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.baeldung.runasingletest.TheSecondUnitTest
17:22:07.063 [main] INFO ...TheSecondUnitTest - Running When Case2: test2_1
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.057 s - in com.baeldung.runasingletest.TheSecondUnitTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
...
如我们所见,这次,我们只执行了指定的测试方法。
6. 更多关于test参数的信息
到目前为止,我们已经展示了如何通过相应地提供test参数值来执行单个测试类或测试方法。
实际上,Maven surefire 插件允许我们以不同的格式设置test参数的值,以灵活地执行测试。
接下来,我们将展示一些常用格式
- 通过名称执行多个测试类:-Dtest=”TestClassName1, TestClassName2, TestClassName3…”
- 通过名称模式执行多个测试类:-Dtest=”*ServiceUnitTest” 或 -Dtest=”The*UnitTest, Controller*Test”
- 通过名称指定多个测试方法:-Dtest=”ClassName#method1+method2″
- 通过名称模式指定多个方法名:-Dtest=”ClassName#whenSomethingHappens_*”
最后,让我们看一个例子。
假设我们只想执行TheSecondUnitTest类中所有“whenTestCase1…”方法。
因此,遵循我们上面讨论的模式,我们希望-Dtest=”TheSecondUnitTest#whenTestCase1*”能完成这项工作
$ mvn test -Dtest="TheSecondUnitTest#whenTestCase1*"
...
[INFO] Scanning for projects...
...
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.baeldung.runasingletest.TheSecondUnitTest
17:51:04.973 [main] INFO ...TheSecondUnitTest - Running When Case1: test1_1
17:51:04.979 [main] INFO ...TheSecondUnitTest - Running When Case1: test1_2
17:51:04.980 [main] INFO ...TheSecondUnitTest - Running When Case1: test1_3
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.055 s - in com.baeldung.runasingletest.TheSecondUnitTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
...
如我们所料,只有匹配指定名称模式的三个测试方法被执行。
7. 结论
Maven surefire 插件提供了一个 test 参数,它允许我们在选择要执行的测试方面拥有很大的灵活性。
在本文中,我们讨论了 test 参数的一些常用值格式。
此外,我们通过示例说明了如何使用 Maven 仅运行指定的测试类或测试方法。
支持本文的代码可在 GitHub 上获取。 一旦你以 Baeldung Pro 会员 身份登录,就开始学习并在项目上进行编码。















