通过maven构建父pom并在Jenkins中运行特定的集成测试?

时间:2016-03-31 19:16:05

标签: maven jenkins continuous-integration integration-testing

在我的父pom上执行mvn clean install构建所有子模块并运行相关的junit测试。它不运行集成测试。

在构建并运行junits之后,我想在特定的子模块中运行特定的集成测试。

我正在使用以下命令:

mvn clean install -DTest=integrationTestName

作业失败,在构建阶段出现No Test Found错误。

我也尝试过使用

mvn clean install -DTest=integrationTestName -pl=sub-module-name

但这只会构建我的子模块进行集成测试。

问题:如何运行某个模块的单一集成测试?

2 个答案:

答案 0 :(得分:4)

我想您尝试使用Maven Surefire插件的test选项(小写)来调用特定测试,Surefire无法在反应堆构建的第一个模块中找到并因此失败。 / p>

我还假设集成测试由Maven Failsafe Plugin执行。如果没有,他们应该如官方文件所述:

  

Failsafe插件旨在运行集成测试,而Surefire插件则用于运行单元测试。 ...如果您使用Surefire插件运行测试,那么当您遇到测试失败时,构建将停止在integration-test阶段,并且您的集成测试环境将不会被正确拆除。 ..在integration-test阶段,Failsafe插件不会使构建失败,从而使post-integration-test阶段能够执行。

简而言之:这样做更安全,更健壮。

虽然Maven Failsafe插件的插件配置条目也是test,但其相应的命令行选项为it.test,因此您应该运行:

mvn clean install -Dit.test=SampleIT

其中SampleIT是集成测试(请注意标准IT后缀,recognized by default由Failsafe。

官方Running a Single Test文档还提供了有关运行单一集成测试的更多详细信息。

另请注意:如果您未在构建的其他模块中进行其他集成测试,则上述调用将起作用,否则将无法在之前找到它(在点击相关模块之前)。

如果您正在使用Surefire运行相关的集成测试(同样,您不应该),或者您有几个模块正在运行集成测试,那么您应该在相关模块中配置一个配置文件来处理这个特定的调用,如下所示:

<profiles>
    <profile>
        <id>run-single-it-test</id>
        <activation>
            <property>
                <name>single.it.test</name>
            </property>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-failsafe-plugin</artifactId>
                    <version>2.19.1</version>
                    <configuration>
                        <test>${single.it.test}</test>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>integration-test</goal>
                                <goal>verify</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

然后按如下方式调用构建:

mvn clean install -Dsingle.it.test=SampleIT

因此,Maven将activate the profile基于single.it.test属性的值的存在,并将其传递给Failsafe插件的test属性(或Surefire,如果它如果是这样的话,Failsafe将忽略该执行的任何其他集成测试,其他模块不会受到任何影响(忽略该属性)。

答案 1 :(得分:2)

A_Di-Matteo的答案可以帮助你完成大部分工作,但是你需要maven-surefire-plugin的以下配置来抑制所有的单元测试。

<profiles>
    <profile>
        <id>run-single-it-test</id>
        <activation>
            <property>
                <name>single.it.test</name>
            </property>
        </activation>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <skipTests>true</skipTests>
                        <failIfNoTests>false</failIfNoTests>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>test</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-failsafe-plugin</artifactId>
                    <configuration>
                        <test>${single.it.test}</test>
                        <failIfNoTests>false</failIfNoTests>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>integration-test</goal>
                                <goal>verify</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>