当前位置: 首页 > 面试题库 >

在并行模式下使用maven-surefire-plugin时如何识别慢速单元测试?

姚永年
2023-03-14
问题内容

为了管理/减少构建时间,我想使用来确定在并行测试环境中哪些单元测试花费的时间最多maven-surefire-plugin

我们正在使用JUnit(4.10)进行单元测试。我们使用maven(2.2.1- 我们使用的某些插件尚不支持maven
3)作为我们的主要构建工具,并使用maven-surefire-plugin(2.19)运行单元测试。

我们使用的是maven-surefire-plugin在并行模式,其中两个单独的方法在平行和单元测试类运行并行运行-这是非常重要的,因为它显著减少了构建单元测试时间。的maven- surefire-plugin配置.pom如下:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19</version>
    <configuration>
      <argLine>-Xmx2G -XX:MaxPermSize=1G -XX:-UseSplitVerifier</argLine>
      <failIfNoTests>false</failIfNoTests>
      <parallel>classesAndMethods</parallel>
      <useUnlimitedThreads>true</useUnlimitedThreads>
    </configuration>
  </plugin>

但是,其含义之一是,在控制台输出中,每个JUnit测试类所花费的时间就是该类中所有方法的合计时间。

例如,如果一个测试类有10个单元测试方法,每个方法要花1秒才能运行,那么该测试类要花大约1秒的时间运行(每个方法并行运行),但是输出将类似于:

运行com.package.QuickParallelTest测试运行:10,失败:0,错误:0,跳过:0,经过时间:10.0秒-在com.package.QuickParallelTest中

这使得很难在控制台输出中将其与具有10种单元测试方法的另一种测试类区分开,其中9种几乎立即运行,而1种几乎需要10秒才能运行。在这种情况下,测试类将花费大约10秒钟来运行(由于一种缓慢的测试方法),但maven- surefire-plugin控制台输出实际上是相同的:

运行com.package.SlowParallelTest测试运行:10,失败:0,错误:0,跳过:0,经过的时间:10.0秒-在com.package.SlowParallelTest中

理想情况下,我希望经过的时间表示测试类(并行运行)花费了多长时间,而不是指示分别运行方法所花费的总时间(就像单线程一样)。

因此,我的问题是:

  1. 我是否缺少maven-surefire-plugin设置,所以打印摘要将显示每个类花费的时间,而不是方法的合计时间?
  2. 这是中的已知“错误”(或“功能”)maven-surefire-plugin吗?(我检查了SureFire JIRA,但找不到类似的东西。)
  3. 是否有其他方法可以让我确定哪些测试需要花费很长时间,因此最适合进行优化。

编辑:

我尝试使用一些其他配置设置。奇怪的是,在配置中添加以下内容.pom似乎会将控制台输出中经过的时间更改为运行测试类所花费的时间-
但是,(在我看来)这是违反直觉的,因为这些设置是默认设置:

    <configuration>
      ...
      <forkCount>1</forkCount>
      <reuseForks>true</reuseForks>
    </configuration>

问题答案:

将reportFormat条目添加到Maven
Surefire插件配置中并将其值设置为plain(而不是默认值brief)将为您提供每种方法所用的时间。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19</version>
            <configuration>
                <argLine>-Xmx2G -XX:MaxPermSize=1G -XX:-UseSplitVerifier</argLine>
                <failIfNoTests>false</failIfNoTests>
                <parallel>classesAndMethods</parallel>
                <useUnlimitedThreads>true</useUnlimitedThreads>
                <reportFormat>plain</reportFormat>
            </configuration>
        </plugin>
    </plugins>
</build>

使用默认的reportFormat(brief)输出:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.sample.mocking.InternalServiceTestCase
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.241 sec - in com.sample.mocking.InternalServiceTestCase

输出plain值:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running com.sample.mocking.InternalServiceTestCase
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.187 sec - in com.sample.mocking.InternalServiceTestCase
test(com.sample.mocking.InternalServiceTestCase)  Time elapsed: 0.005 sec
mockTest(com.sample.mocking.InternalServiceTestCase)  Time elapsed: 0.17 sec
mockTestFailureTollerance(com.sample.mocking.InternalServiceTestCase)  Time elapsed: 0.007 sec
mockProcessfile(com.sample.mocking.InternalServiceTestCase)  Time elapsed: 0.003 sec

此选项可以为您提供有关测试和执行时间的更多详细信息。



 类似资料:
  • 我试过下面的东西,但不起作用。 我可以使用gradle maxParallelForks属性在类(spec)级别执行测试,但我希望在测试级别并行运行。

  • 问题内容: 我尝试使用Maven创建一个测试项目,并且单元测试工作正常。但是,当尝试对j2ee项目执行相同操作时,surefire无法找到单元测试。测试位于正确的目录(src / test / java)中,并且正在对其进行编译。 junit测试位于src / test / java / unit / TestAddition.java pom.xml中的surefire插件配置不包含/排除任何文

  • null 默认情况下,IntelliJ提供Ofc Maven。我已经尝试了mvnDebug tomcat7:run命令,但是intelliJ不能解析Maven内置命令行中的mvnDebug短语。也不能使用cmd命令行,因为我找不到“home”路径,因为maven是内置的IntelliJ。也尝试使用intelli,配置远程调试,但感到困惑。在“Maven Projects”窗口中也找不到tomcat

  • 当我使用maven运行我的testng套件xml时,在suite标记中没有parallel=“tests”时,我会出现异常。 当我用parallel=“tests”运行它时,它工作得很好。此外,如果我在没有parallel=“tests”的情况下从eclipse“Run as testng Test”运行我的testng套件xml,它工作得很好。请帮忙。

  • 有什么办法可以做到吗?如果我们不能用maven surefire插件来做,是否可以在测试中配置它?

  • 我一直在周而复始地试图弄明白这一点,在Selenium网格集群上使用cucumber和maven并行选项几乎是不可能的。 我的跑步者根据标签跑步,应该会选择5到6个特征文件。 我使用Cucumber for Java、Maven surefire 2.19和Junit。 到目前为止,pom的surefire配置如下所示:- 我的跑步者看起来像这样:- 我和马文一起跑步:- 清洁测试-P RunFe