【问题标题】:maven build takes unexpectedly longmaven 构建需要很长时间
【发布时间】:2013-10-07 23:05:19
【问题描述】:

我有一个包含单元测试和集成测试的项目。我有两个测试套件:

@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 个集成测试。

这很好,但是当我尝试在本地和 Jenkins 内部运行我的 maven 构建时,测试数字在 12-18 分钟之间运行 348 个测试。显然是我的 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>

是否有原因导致测试出现重复且耗时如此之长?

【问题讨论】:

  • 这个问题似乎离题了,因为它显然过于本地化,不适合您的情况
  • 不确定我是否理解您的意思。这是一个 maven 代码覆盖率问题,当然我不是唯一对此主题有疑问的人。

标签: java maven jacoco


【解决方案1】:

我不是 maven 或 surefire 专家,但我认为 surefire 插件会执行它在您的测试目录下找到的每个测试文件。这意味着默认配置不需要测试套件。 Surefire 找到并运行您的测试套件加上您的其他测试可能是要运行的测试数量增加 2 倍的原因。但我不知道为什么它会花费两倍以上的时间来运行。

如果是这种情况,您可以告诉 Surefire 只运行您的测试套件:

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

而不是**/*.class

编辑:因为 Jacoco 已经检测了您需要使用的类

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

否则,您不会运行检测版本。

【讨论】:

  • 我进行了更改,构建只用了两分钟。但是,我没有代码覆盖率或其他声纳覆盖率。
  • 改成AutoTestSuite.class会怎样?
  • 谢谢!我将surefire更改为AutoTestSuite.class,将failsafe更改为IntegrationTestSuite.class,我的构建时间缩短到大约2.40分钟。 Sonar 负责所有单元和集成测试。
  • 太棒了!我更新了我的答案,以防其他人遇到同样的问题,这样他们就不必阅读 cmets 以获得最终答案。
猜你喜欢
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2013-10-05
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
相关资源
最近更新 更多