Maven跳过测试
Posted
技术标签:
【中文标题】Maven跳过测试【英文标题】:Maven skip tests 【发布时间】:2014-09-03 20:07:21 【问题描述】:我正在使用 Maven 2.2.1 并且为了构建我的项目,我使用了这个命令
mvn clean install -Dmaven.test.skip=true
但是,构建失败,说它找不到工件之一。但是,当我使用时:
mvn clean install -DskipTests
一切正常。
到目前为止,我一直认为这两个命令是等效的。但是,this link 似乎暗示-Dmaven.test.skip=true
也跳过编译测试用例。
但是,这仍然没有向我解释为什么一个命令有效而另一个命令无效。如果有人请向我解释一下,将不胜感激。
【问题讨论】:
您使用的是哪个版本的 maven-surefire-plugin?和你看的doc版本一样吗? 一个跳过构建,另一个跳过运行。如果你想要两者都使用。 您能否提供失败的详细信息 - 错误消息或堆栈跟踪? 你为什么要使用already defined EoL这么旧的Maven版本。 那么,要完全跳过与测试相关的所有内容,我必须使用-Dmaven.test.skip=true -DskipTests
,这真的是真的吗?有时可以省略其中一个,具体取决于具体情况,但谁愿意考虑这一点..
【参考方案1】:
如您所述,-Dmaven.test.skip=true
跳过编译测试。更重要的是,它跳过了构建测试工件。大型项目的一种常见做法是在同一项目中的模块之间共享测试实用程序和基类。
这是通过让一个模块需要一个先前构建的模块的test-jar
来实现的:
<dependency>
<groupId>org.myproject.mygroup</groupId>
<artifactId>common</artifactId>
<version>1.0</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
如果指定了-Dmaven.test.skip=true
(或简称为-Dmaven.test.skip
),则不会构建test-jar
s,任何依赖它们的模块都将无法构建。
相比之下,当您使用 -DskipTests
时,Maven 不会运行测试,但它会编译它们并构建 test-jar,使其可用于后续模块。
【讨论】:
如何解决这个问题?作为我的在线 maven 命令使用 -Dmaven.test.skip。 @neptune 什么问题?如果您有新问题,请使用新帖子提问。 您的依赖项中缺少<classifier>tests
。见Default Artifact Handlers Reference。【参考方案2】:
为了构建包,我与测试有一些相互依赖关系。
以下命令设法覆盖对测试工件的需求以完成目标:
mvn -DskipTests=true package
【讨论】:
在 cmd 行上只需... -DskipTests ...
就足够了。【参考方案3】:
每个参数都有区别。
-DskipTests
跳过运行测试阶段,这意味着在此过程结束时,您将编译测试。
-Dmaven.test.skip=true
跳过编译和运行测试阶段。
由于参数-Dmaven.test.skip=true
跳过编译,您没有测试工件。
欲了解更多信息,请阅读 surfire 文档:http://maven.apache.org/plugins-archives/maven-surefire-plugin-2.12.4/examples/skipping-test.html
【讨论】:
【参考方案4】:为了在 maven 全新安装期间跳过测试用例,我在以下命令中使用了 -DskipTests 参数
mvn clean install -DskipTests
进入终端窗口
【讨论】:
-DskipTests
不只是跳过 the 测试用例。它会跳过所有个测试用例。【参考方案5】:
我可以给你一个导致同样问题的例子,但它可能无法回答你的问题。 (另外,在本例中,我使用的是我的 Maven 3 知识,可能不适用于 Maven 2。)
在多模块 maven 项目中(包含模块 A
和 B
,其中 B
依赖于 A
),您还可以添加 A
的 测试依赖项在B
。
B
中的这个依赖可能如下所示:
<dependency>
<groupId>com.foo</groupId>
<artifactId>A</artifactId>
<classifier>tests</classifier>
<type>test-jar</type> <!-- I'm not sure if there is such a thing in Maven 2, but there is definitely a way to achieve such dependency in Maven 3. -->
<scope>test</scope>
</dependency>
(更多信息请参考https://maven.apache.org/guides/mini/guide-attached-tests.html)
请注意,项目 A
通常会生成带有分类器 tests
(即 .../com/foo/A/<version>/A-<version>-tests.jar
)的辅助工件,其中测试类和测试资源位于其中。
如果您使用-Dmaven.test.skip=true
构建项目A
,则在构建B
时会出现依赖解析错误,除非在您的本地仓库或远程仓库中找到A
的测试工件存储库。原因是A
的测试类没有编译,也没有产生A
的tests
工件。
但是,如果您使用-DskipTests
构建A
,则会生成其tests
工件(尽管测试不会运行)并且B
中的依赖关系将被成功解决。
【讨论】:
【参考方案6】:参数 -DskipTests 可能不起作用,具体取决于您的surefire插件版本。
您可以使用“-Dmaven.test.skip.exec”代替“-DskipTests”
来源:Surefire Parameter Details
【讨论】:
谢谢。mvn clean install -Dmaven.test.skip.exec
命令对我有用。
<skipExec>
/ maven.test.skip.exec
是“已弃用。请改用 skipTests。”。【参考方案7】:
我为 Intellij 用户提供了另一种方法,它对我来说效果很好:
-
点击“跳过测试”按钮
-
按住“CTRL”按钮
选择“清理”和“安装”
-
点击 maven 面板中的“运行”按钮
【讨论】:
“安装”阶段包括“测试”,因此此方法不排除测试。 @EduardStreltsov 当你点击“跳过测试”按钮时,你会发现“测试”步骤被排除在外 忘记了跳过测试按钮,我的错。检查,它有效 这只是回答了一半的问题:-DskipTests
部分,不是吗?
@GeroldBroser 不,当你使用这种方法时,你不需要 -DskipTests 部分,intelliJ 会处理它:)【参考方案8】:
在 maven 编译期间,您可以通过在 pom.xml 中添加以下插件来跳过测试执行
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
【讨论】:
即使您执行mvn test
,它也会跳过测试
我不推荐这样做(除了特殊环境,例如在两个不同的项目中有生产代码和测试代码)。 Maven 的默认约定是在构建期间运行(单元)测试。这样,您就可以无缘无故地覆盖此默认行为。改用命令行属性或使用名为skipTests
的构建配置文件(如果你真的必须),它设置属性并通过cmd 行上的mvn ... -PskipTests ...
或通过其他activation methods 之一激活。【参考方案9】:
为了最快的构建,跳过编译测试文件和运行测试:
mvn install -Dmaven.test.skip -DskipTests
来自Maven Surefire Plugin docs:
您也可以通过命令行执行以下命令跳过测试:
mvn install -DskipTests
如果你绝对必须,你也可以使用 maven.test.skip 属性来跳过编译测试。 maven.test.skip 受到 Surefire、Failsafe 和 Compiler Plugin 的认可。
mvn install -Dmaven.test.skip=true
更多加快安装速度的方法可以在this answer 找到问题“Ways to make maven build faster?”。
【讨论】:
【参考方案10】:使用最新版本的 Maven
指令位变化的方式。
以下命令将完美运行
mvn clean install "-Dmaven.test.skip=true"
【讨论】:
这不是“使用最新版本的 Maven”。这从 Maven 编译器插件的 v2.0 开始就存在。我们现在是 v3.8.1。【参考方案11】:我使用以下代码跳过编译和运行测试:
mvn install -Dmaven.test.skip.exec -Dmaven.test.skip=true
【讨论】:
<skipExec>
/ maven.test.skip.exec
是“已弃用。请改用 skipTests。”。
对于我的情况,skipTests 不起作用。只有我在答案中使用的标志有效。可能是maven版本的原因。以上是关于Maven跳过测试的主要内容,如果未能解决你的问题,请参考以下文章