通常跳过单元测试是一个坏的开发习惯。然而,在某些情况下也有例外情况;可能是当我们在开发新代码并希望运行测试无法通过或无法编译的中间构建时。
仅在这些情况下,我们可以跳过测试,以避免编译和运行它们的开销。当然,考虑到不运行测试会导致隐藏的程序BUG在开发过程中不被发现
在本文中,我们将介绍使用Maven跳过测试的各种命令和参数
在讨论如何跳过测试的细节之前,我们必须了解测试是在什么时候编译或运行的。在关于Maven目标和阶段,需要深入了Maven生命周期的概念,但在本文中,重要的是要知道Maven可以:
在我们的示例中,我们将使用打包阶段作为列子,这包括编译和运行测试。本教案例中使用Maven Surefire插件作为编译打包插件
首先,让我们看一个无法编译的测试示例:
@Test
public void thisDoesntCompile() {
some bug ;
}
当我们运行command-line命令时:
mvn package
我们会在控制台中看到一个错误:
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /Users/baeldung/skip-tests/src/test/java/com/antmordel/skiptests/PowServiceTest.java:[11,9] not a statement
[INFO] 1 error
因此,我们需要跳过测试源代码的编译阶段。在Maven中,我们可以设置**-Dmaven.test.skip** 标识符跳过单元测试代码的编译和执行:
mvn -Dmaven.test.skip package
通过上面的设置,单元测试代码没有被编译,也没有被执行
第二种情况,让我们看看如何只编译测试代码,但跳过运行单元测试过程。这对于那些我们没有更改方法或类的签名但更改了业务逻辑而导致测试失败的情况非常有用。让我们考虑一个像下面这样设计的测试用例,它总是会失败:
@Test
public void thisTestFails() {
fail("This is a failed test case");
}
由于在单元测试中了fail()语句,如果我们在打包阶段执行构建将会失败,并出现错误:
[ERROR] Failures:
[ERROR] PowServiceTest.thisTestFails:16 This is a failed test case
[INFO]
[ERROR] Tests run: 2, Failures: 1, Errors: 0, Skipped: 0
假设我们想要跳过运行测试,但仍然希望编译它们。在这种情况下,我们可以使用**-DskipTests**标志符:
mvn -DskipTests package
上面打包阶段将会执行成功,同时会跳过单元测试执行。此外,在Maven中,有一个专门用于运行集成测试的插件,称为Maven failsafe plugin,使用-DskipTests将跳过单元测试(surefire)和集成测试(failsafe)的执行。为了跳过集成测试,我们可以通过-DskipITs系统属性。
如果非临时跳过单元测试,而是希望长期停止单元测试,我们可以修改POM.xml文件
正如上文介绍的,我们希望不编译测试代码,我们可以在POM.xml中做如下设置:
true
请注意,我们可以通过在命令行中添加相反的标志来覆盖该值:
mvn -Dmaven.test.skip=false package
同样,我们只编译测试代码,但跳过测试执行。我们可以修改Maven Surefire插件配置:
properties>
true
org.apache.maven.plugins
maven-surefire-plugin
2.22.1
${tests.skip}
上面,tests.skip是我们定义的自定义属性。因此,我们可以覆盖它,如果我们想要执行测试执行如下操作:
mvn -Dtests.skip=false package
在本文中,我们介绍了两种跳过Maven跳过执行单元测试的方法,一种是通过命令行参数形式,另一种是通过设置POM.xml文件方式