我有一个多模块maven项目,在同一个文件夹(src/test/java)中包含集成和单元测试。集成测试标记为@类别(IntegrationTest.class)
。我想以以下设置结束:
mvn安装
,我希望所有测试都能编译,但我不想执行任何测试
重要的一点是,我希望在pom.xml
中配置它,而没有任何额外的命令行参数。
目前,我在我的父母pom中提出了以下设置。xml,其中唯一的问题是#1,其中执行所有测试:
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${project.java.version}</source>
<target>${project.java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.14.1</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.14.1</version>
</dependency>
</dependencies>
<configuration>
<includes>
<include>**/*.class</include>
</includes>
<excludedGroups>cz.cuni.xrg.intlib.commons.IntegrationTest</excludedGroups>
</configuration>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.14.1</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit47</artifactId>
<version>2.14.1</version>
</dependency>
</dependencies>
<configuration>
<groups>cz.cuni.xrg.intlib.commons.IntegrationTest</groups>
</configuration>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
<configuration>
<includes>
<include>**/*.class</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
所有子模块的pom中都有以下插件配置。xml,我认为应该从父pom继承:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
</plugins>
</build>
我试着使用
在几个小时的谷歌搜索和尝试不同的组合后,我犹豫是否有可能不在
mvn安装
中运行测试,同时在mvn测试
中运行它们。我希望有人能证明这是错的
我也愿意接受这样一种解决方案,
mvn install
只执行单元测试,但我认为这并没有多大区别。
OP在他的问题中说:
如果我运行mvn安装,我想编译所有测试,但我不想执行任何测试
如果我运行mvn测试,我希望编译所有测试,但只执行单元测试
如果我运行mvn集成测试,我想编译并执行所有测试。
非常有效,而且非常容易实现
编辑:除了第一个条件,它违背了maven的本性。这里最好的方法就是简单地执行mvn安装-DskipTests
您只需要在pom中跟踪代码片段。xml
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.17</version>
<executions>
<execution>
<id>integration-tests</id>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
并坚持单元和集成测试的maven命名约定(如@khmarbaise所述)。因此,通常将集成测试命名为IT
后缀(例如MyIntegrationTestIT.java
),并让maven failsafe
完成它的工作
这样,您甚至不需要JUnit类别(尽管有时它们非常有用)。
就这样:)
mvn test
只执行单元测试mvn集成测试
执行所有测试mvn故障安全:集成测试
仅运行集成测试mvn清洁验证
当您想确定时,整个项目只是工作将集成测试与单元测试分开,可以让您轻松地在IDE中运行某个包中的所有测试。通常使用名为test integration
(或integrationtest
)的附加目录来实现此目的
使用maven也很容易做到这一点:
<plugin>
<!-- adding second test source directory (just for integration tests) -->
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.9.1</version>
<executions>
<execution>
<id>add-integration-test-source</id>
<phase>generate-test-sources</phase>
<goals>
<goal>add-test-source</goal>
</goals>
<configuration>
<sources>
<source>src/test-integration/java</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
然后将集成测试移动到该目录。它应该是这样的:
src
main
test
test-integration
集成测试通常需要更多内存:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
...
<configuration>
<argLine>-Xmx512m -XX:MaxPermSize=256m</argLine>
</configuration>
</plugin>
根据故障安全插件留档
mvn install -DskipITs
这就是你想要的。
听起来你不理解Maven中构建生命周期的概念。如果运行mvn安装
所有生命周期阶段(包括安装
阶段本身)都在安装阶段之前运行。这意味着运行以下阶段:
也就是说,包括测试
以及集成测试
生命周期阶段。因此,如果没有任何补充信息,就不可能随心所欲地改变行为。
可以通过在Maven中使用配置文件来实现:
<project>
[...]
<profiles>
<profile>
<id>no-unit-tests</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
[...]
</project>
所以你的第一个要求:
mvn安装
,我希望所有测试都能编译,但我不想执行任何测试
可通过以下方法实现:
mvn -Pno-unit-test test
这可以简单地通过使用普通调用来实现:
mvn test
导致集成测试阶段未运行(请参阅构建生命周期)。
这意味着运行默认值,其中包括运行test
阶段,该阶段将运行单元测试(maven-surefire-plugin),此外还运行由maven-故障安全插件处理的联调。但是您应该知道,如果您想调用集成测试,您应该使用以下命令:
mvn verify
相反,因为您错过了上一次调用中的后集成测试
阶段。
除上述内容外,您还应遵循单元测试和集成测试的命名约定,单元测试的命名应如下所示:
<includes>
<include>**/*Test*.java</include>
<include>**/*Test.java</include>
<include>**/*TestCase.java</include>
</includes>
集成测试的名称应如下所示:
<includes>
<include>**/IT*.java</include>
<include>**/*IT.java</include>
<include>**/*ITCase.java</include>
</includes>
我希望您已经按照以下方式配置了maven failsafe插件,这是将maven failsafe插件绑定到正确生命周期阶段所需的:
<project>
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.15</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
</project>
正如您所做的,但是您应该知道,include
标记对源代码(.java)有效,而不是对编译名(.class)有效。我不会使用类别注释,只是简单地使用命名约定会使pom更简单、更短。
我目前正在为Hibernate项目Hibernate Search构建一个新包,我需要使用Arquillian在托管的WildFly容器中运行一些单元测试。当我使用命令时,我得到了以下错误: org.jboss.arquillian.container.spi.配置异常:jbossHome'${project.build.directory}/node1/wilfly-${org.wildfly}
我已经使用selenium创建了测试用例,之前我可以使用maven(从命令行和eclipse)执行我的测试用例。但是现在它不起作用了。请帮助 请在下面找到控制台日志:(运行为- 我没有得到任何错误,它成功地构建了一个项目。但是跳过所有测试用例 请找到我的pom。xml配置如下: 请找到E2E。xml如下:
我正在使用Maven 2.2.1,为了构建我的项目,我使用了以下命令 但是,构建失败了,说它找不到一个工件。然而,当我使用: 一切正常。 到目前为止,我一直认为这两个命令是等效的。然而,这个链接似乎表明,Dmaven。测验skip=true也会跳过编译测试用例。 然而,这仍然不能向我解释为什么一个命令有效,而另一个命令无效。如果有人能向我解释这一点,我将不胜感激。
问题内容: 我正在尝试打包我的项目。但是,它会自动运行以前执行打包的测试。测试将一些内容插入数据库。这不是我想要的,我需要避免在打包应用程序时运行测试。有人知道如何在没有测试的情况下运行软件包吗? 问题答案: 与运行Maven
我有3个maven项目。项目1,项目2 为此,我在项目2 pom.xml文件中添加了这个 我的pom。Project3的xml是- 在项目3中,我添加了testng。xml文件来运行测试。现在如果我运行这个测试。xml文件,那么我所有的测试用例都成功运行了。如果我尝试使用maven测试运行测试用例,那么它会失败。 我已经在下面的pom文件中包含了testng.xml文件,以便使用maven运行te
以下命令不运行我的任何测试: 而普通的旧确实如此。 我在测试中添加了这些注释: 我在这里或这里的插件文档页面上都没有看到任何相关信息