使用Maven分离单元测试和集成测试

5

我正在Jenkins中设置CD流水线,并希望将我的单元测试和集成测试分别运行在两个步骤中。计划是让我的流水线脚本看起来像这样,并让它们分别运行:

    stage('Unit tests') {
        steps {
            withMaven(maven: 'Maven 3.6.2') {
                sh 'mvn test -P coverage'
            }
        }
    }
    stage('Integration tests') {
        steps {
            withMaven(maven: 'Maven 3.6.2') {
                sh 'mvn test -P coverage'
            }
        }

我已经尝试按照这里描述的方法使用surefire插件:https://dzone.com/articles/splitting-unit-and-integration-tests-using-maven-a,运行'mvn test'只会运行单元测试,但是'mvn integration-test'会同时运行单元测试和集成测试。

我也尝试按照这里描述的方法使用failsafe插件:Maven separate Unit Test and Integration Tests,但是无论我输入哪些选项,'mvn verify'都会运行单元测试和集成测试。

如何使我的流水线在两个不同的步骤中执行单元测试和集成测试?

使用surefire的Pom:

            <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId> <!-- surefire plugin version managed by Spring Boot -->
            <configuration>
                <skipTests>true</skipTests>
            </configuration>
            <executions>
                <execution>
                    <id>unit-tests</id>
                    <phase>test</phase>
                    <goals>
                        <goal>test</goal>
                    </goals>
                    <configuration>
                        <skipTests>false</skipTests>
                        <includes>
                            <include>**/*Test.java</include>
                        </includes>
                    </configuration>
                </execution>
                <execution>
                    <id>integration-tests</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>test</goal>
                    </goals>
                    <configuration>
                        <skipTests>false</skipTests>
                        <includes>
                            <include>**/*IT.*</include>
                            <include>**/*Tests.*</include>
                        </includes>
                    </configuration>
                </execution>
            </executions>
        </plugin>

Pom与Surefire和Failsafe:

            <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.19.1</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-failsafe-plugin</artifactId>
                    <version>2.19.1</version>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skip>${surefire.skip}</skip>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>

你能提供一个pom.xml的例子或者更好的是一个带有示例代码的项目吗? - Vokail
1
为什么你喜欢将它们分开?运行单元应该总是完成...有时可能需要单独运行集成测试,通常通过maven-failsafe-plugin和使用mvn clean verify -Prun-its(仅在集成测试需要很长时间时使用配置文件)来完成...不要使用maven-surefire-plugin来运行集成测试...遵循惯例,使用单元测试名称*Test.java,而集成测试名称为*IT.java(详见文档)...不要按照你正在进行的方式配置surefire,因为已经存在非常好的默认值...在99.999%的情况下是正确的。 - khmarbaise
1
每次构建都将运行单元测试和集成测试,但我们希望将它们分开以更好地控制失败的位置。 - PalBo
正如我所写的那样,正确使用命名约定,并且可以通过mvn clean test运行单元测试以及通过mvn clean verify(可能需要补充-Prun-its以运行集成测试)。 - khmarbaise
不要将 maven-surefire-plugin 绑定到 integration-test 部分,这是使用 maven-failsafe-plugin 时的意图... - khmarbaise
显示剩余5条评论
1个回答

4

这对我很有帮助:

以下是一个示例 pom.xml,它可与以下命令一起使用:

  • mvn clean verify -DskipUTs=true : Runs only integration tests (tests ending in "IT")
  • mvn clean verify -DskipITs=true : Runs only unit tests (tests ending in "Test")
  • mvn clean verify -DskipTests=true : Skips all tests

    <build>
    <finalName>test-app</finalName>
    <plugins>
    
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId> <!-- surefire plugin version managed by Spring Boot -->
            <configuration>
                <skipTests>${skipUTs}</skipTests>
            </configuration>
        </plugin>
    
        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>3.0.0-M3</version>
            <executions>
                <execution>
                    <id>run-integration-tests</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <skipTests>${skipTests}</skipTests>
                <skipITs>${skipITs}</skipITs>
            </configuration>
        </plugin>
    
    </plugins>
    </build>
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接