-2

単体テストと統合テストを含むプロジェクトがあります。2 つのテスト スイートがあります。

@RunWith(ClasspathSuite.class)
@ClasspathSuite.ClassnameFilters({ ".*Test", "!.*IntegrationTest", "!.*ResourceTest", "!.*DAOTest" })
@ClasspathSuite.SuiteTypes({ SuiteType.JUNIT38_TEST_CLASSES, SuiteType.TEST_CLASSES, SuiteType.RUN_WITH_CLASSES })
public class AutoTestSuite {
}

約 20 秒で 70 個のテストを実行します

@RunWith(ClasspathSuite.class)
@ClasspathSuite.SuiteTypes({ SuiteType.JUNIT38_TEST_CLASSES, SuiteType.TEST_CLASSES, SuiteType.RUN_WITH_CLASSES })
@ClasspathSuite.ClassnameFilters({ ".*IntegrationTest" })
public class IntegrationTestSuite {
}

約 80 秒で 99 個の統合テストを実行します。

これは問題ありませんが、maven ビルドをローカルで Jenkins 内で実行しようとすると、348 個のテストを実行するのに 12 ~ 18 分かかります。明らかに私の pom.xml であり、検査する jacoco も考慮されています。" mvn clean package :

<plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.6.0.201210061924</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <propertyName>jacoco.argLine.unit</propertyName>
                            <destFile>${jacoco.destFile.unit}</destFile>
                        </configuration>
                    </execution>
                    <execution>
                        <id>pre-integration-test</id>
                        <phase>pre-integration-test</phase>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                        <configuration>
                            <propertyName>jacoco.argLine.it</propertyName>
                            <destFile>${jacoco.destFile.it}</destFile>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <!-- UNIT tests only with mvn clean test -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${version.surefire}</version>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.maven.surefire</groupId>
                        <artifactId>surefire-junit47</artifactId>
                        <version>${version.surefire}</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <argLine>${jacoco.argLine.unit}
                        -Dfile.encoding=${project.build.sourceEncoding} -Xmx512m
                    </argLine>
                    <forkMode>always</forkMode>
                    <parallel>classes</parallel>
                    <includes>
                        <include>**/*.class</include>
                    </includes>
                    <excludes>
                        <exclude>**/*.IntegrationTest.java</exclude>
                    </excludes>
                </configuration>
            </plugin>
            <!-- INTEGRATION tests that are run with "mvn clean verify" -->

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <version>${version.surefire}</version>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.maven.surefire</groupId>
                        <artifactId>surefire-junit47</artifactId>
                        <version>${version.surefire}</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <forkMode>pertest</forkMode>
                    <reportsDirectory>${project.build.directory}/surefire-reports</reportsDirectory>
                    <argLine>${jacoco.argLine.it}
                        -Dfile.encoding=${project.build.sourceEncoding} -Xmx512m
                    </argLine>
                    <includes>
                        <include>**/*.class</include>
                    </includes>
                </configuration>
                <executions>
                    <execution>
                        <id>integration-test</id>
                        <phase>integration-test</phase>
                        <goals>
                            <goal>integration-test</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>verify</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

テストが重複していて時間がかかるように見える理由はありますか?

4

1 に答える 1

2

私は Maven や Surefire の専門家ではありませんが、surefire プラグインは test ディレクトリの下で見つかったすべてのテスト ファイルを実行すると思います。これは、既定の構成にテスト スイートが必要ないことを意味します。確実にテストスイートを見つけて実行し、さらに他のテストを実行すると、実行するテストの数が 2 倍になる可能性があります。しかし、実行に 2 倍以上の時間がかかる理由がわかりません。

この場合、surefire にテスト スイートのみを実行するように指示できます。

<configuration>
  ...
  <includes>
    <include>AutoTestSuite.java</include>
  </includes>
</configuration>

それ以外の**/*.class

編集: Jacoco は、使用する必要があるクラスを既にインストルメント化しているため

<configuration>
  ...
  <includes>
    <include>AutoTestSuite.class</include>
  </includes>
</configuration>

それ以外の場合は、インストルメント化されたバージョンを実行しません。

于 2013-10-07T23:16:33.837 に答える