Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在maven中使用JUnit类别运行测试时的性能损失_Java_Junit_Categories_Maven Surefire Plugin_Test Suite - Fatal编程技术网

Java 在maven中使用JUnit类别运行测试时的性能损失

Java 在maven中使用JUnit类别运行测试时的性能损失,java,junit,categories,maven-surefire-plugin,test-suite,Java,Junit,Categories,Maven Surefire Plugin,Test Suite,我重构了一个项目,从使用测试套件到使用JUnit类别注释。我注意到在使用类别时有一个非常显著的性能损失(慢了4倍) 背景: 约110个测试类,包含约400个测试方法 old:这110个测试类通过11个测试套件执行(每个maven子模块有一个测试套件) 新增:这110个测试类现在由类别FastTest注释(在类级别) 其中103种测试方法由SmokeTest附加注释(每个测试类别最多1个测试用例) SmokeTest接口是FastTest的派生 开始分类测试:mvn测试-p快速测试rspmvn

我重构了一个项目,从使用测试套件到使用JUnit类别注释。我注意到在使用类别时有一个非常显著的性能损失(慢了4倍)

背景:

  • 约110个测试类,包含约400个测试方法
  • old:这110个测试类通过11个测试套件执行(每个maven子模块有一个测试套件)
  • 新增:这110个测试类现在由类别
    FastTest
    注释(在类级别)
  • 其中103种测试方法由
    SmokeTest
    附加注释(每个测试类别最多1个测试用例)
  • SmokeTest接口是FastTest的派生
开始分类测试:
mvn测试-p快速测试
rsp<代码>mvn测试-P烟雾测试(参见下面的pom.xml)

Maven输出

                          Old (suites)    New (FastTest)      new (SmokeTest)
Total time:               02:04 min        07:55 min          06:33 min
Time elapsed (summed up)  95.638 s         102.925 s          51.484 
使用类别的运行持续时间延长了近4倍(同时执行相同数量的测试)。执行冒烟测试(103个测试用例)的时间几乎与执行所有400个测试用例的时间一样长

Oviousy也是报告的
总时间
与累计的
已用时间
之间的巨大差异。后者似乎只是测试方法中测量的时间,没有额外的开销(启动JVM等)

似乎冲浪插件只需要反省类别注释就需要相当多的时间

是否有可能克服这一性能损失?注意:由于测试中的生产代码需要初始化/完成一个全局库(可以访问本机库,这不能在同一系统上并行完成),因此我很难使用连续执行(无fork、无并行等)

Pom.xml(部分)


烟雾测试
ch.人体工程学.junit.category.SmokeTest
快速测试
ch.Humanetics.junit.category.FastTest
org.apache.maven.plugins
maven surefire插件
${test.includedGroups}
${test.excludedGroups}
假的
1.
1.
假的

surfire插件版本:3.0.0-M5

这没有意义,但是,是否会为每一种测试方法都启动一个新的JVM?我不能完全相信Surefire插件会有那么多开销。我不确定这一点。但是在这两个测试运行中,surfere插件的配置在fork/thread方面是完全相同的。我只能想象,当运行一个测试套件时,它只启动一个JVM,而不是在类别模式下为每个测试类启动一个JVM。还有一个问题,您使用的是哪个版本的surefire插件?它是3.0.0-M5。编辑了这个问题,这没有什么意义,但是,是否可以为每个测试方法都启动一个新的JVM?我不能完全相信Surefire插件会有那么多开销。我不确定这一点。但是在这两个测试运行中,surfere插件的配置在fork/thread方面是完全相同的。我只能想象,当运行一个测试套件时,它只启动一个JVM,而不是在类别模式下为每个测试类启动一个JVM。还有一个问题,您使用的是哪个版本的surefire插件?它是3.0.0-M5。编辑这个问题
<profile>
    <id>smoke-tests</id>
    <properties>
        <test.includedGroups>
            ch.ergonomics.junit.category.SmokeTest
        </test.includedGroups>
        <test.excludedGroups></test.excludedGroups>
    </properties>
</profile>
<profile>
    <id>fast-tests</id>
    <properties>
        <test.includedGroups>
            ch.ergonomics.junit.category.FastTest
        </test.includedGroups>
        <test.excludedGroups></test.excludedGroups>
    </properties>
</profile>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <groups>${test.includedGroups}</groups>
                <excludedGroups>${test.excludedGroups}</excludedGroups>
                <useSystemClassLoader>false</useSystemClassLoader>
                <threadCount>1</threadCount>
                <forkCount>1</forkCount>
                <reuseForks>false</reuseForks>
            </configuration>
        </plugin>