我在这里有一个应用程序,其中的单元测试无法并行运行。
使用Maven运行测试时,某些测试由于该原因而失败。 我可以通过
验证它们是否并行运行System.out.println(System.currentTimeMillis() +">>> executing testXXX");
System.out.println(System.currentTimeMillis() +">>> finished testXXX");
在每个方法的开头和结尾处的。 输出为:
1530602546964>>> executing testInstantiation
1530602547036<<< finished testInstantiation
1530602547042>>> executing testSimilarNamedResources
1530602547050>>> executing testTranslateWithMissingKey
1530602547051>>> executing testTryTranslateWithMissingKey
1530602547051<<< finished testTryTranslateWithMissingKey
1530602547051>>> executing testTranslationMapWithMissingKey
1530602547055>>> executing testSilentlyIgnoringExceptionTranslationMapWithMissingKey
1530602547055<<< finished testSilentlyIgnoringExceptionTranslationMapWithMissingKey
正如我们在testSimilarNamedResources启动之后看到的那样,其他一些测试也已经启动。
我尝试将surefire插件配置为不并行运行:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
<configuration>
<!--parallel>false</parallel-->
<threadCount>1</threadCount>
<perCoreThreadCount>false</perCoreThreadCount>
</configuration>
</plugin>
</plugins>
</build>
但是它仍然并行执行这些测试。
我使用-X
选项运行mvn来查看是否应用了我的配置并获得了以下输出:
$ mvn -X test | grep -iE "(parallel|threadcount)"
<parallel>${parallel}</parallel>
<parallelMavenExecution default-value="${session.parallel}"/>
<parallelOptimized default-value="true">${parallelOptimized}</parallelOptimized>
<parallelTestsTimeoutForcedInSeconds>${surefire.parallel.forcedTimeout}<parallelTestsTimeoutForcedInSeconds>
<parallelTestsTimeoutInSeconds>${surefire.parallel.timeout}<parallelTestsTimeoutInSeconds>
<perCoreThreadCount default-value="true">false</perCoreThreadCount>
<threadCount>0</threadCount>
<threadCountClasses default-value="0">${threadCountClasses}</threadCountClasses>
<threadCountMethods default-value="0">${threadCountMethods}</threadCountMethods>
<threadCountSuites default-value="0">${threadCountSuites}</threadCountSuites>
[DEBUG] (f) parallelMavenExecution = false
[DEBUG] (s) parallelOptimized = true
[DEBUG] (s) perCoreThreadCount = false
[DEBUG] (s) threadCount = 0
[DEBUG] (s) threadCountClasses = 0
[DEBUG] (s) threadCountMethods = 0
[DEBUG] (s) threadCountSuites = 0
我在插件配置中错过了什么吗?
更新:
我放弃了。行为太奇怪了。尝试创建简单的示例无效。这些测试不是并行运行的。我不知道为什么是这种情况。 我们将修改整个代码,从而进行单元测试。不再需要找到解决方案,但这仍然让我感到困惑,为什么它表现出这种奇怪的行为……
答案 0 :(得分:2)
我建议您遵循以下指导:
由于maven-surefire-plugin:2.18,您可以在JUnit测试的Java类(纯测试类,Suite,Parameterized等)上应用JCIP批注@ net.jcip.annotations.NotThreadSafe。它在单线程实例中。该线程的名称为maven-surefire-plugin @ NotThreadSafe,并在测试运行结束时执行。 https://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html#Parallel_Test_Execution_and_Single_Thread_Execution
就像其他人所说的那样,它们应该被真正重写,并且作为例外,应该注释那些绝对不能并行运行的测试。
对于您的插件定义,我建议您让它并行运行,因为它在现代计算机上可能要快得多。
我的定义为:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<useUnlimitedThreads>true</useUnlimitedThreads>
<runOrder>random</runOrder>
<redirectTestOutputToFile>true</redirectTestOutputToFile>
<rerunFailingTestsCount>1</rerunFailingTestsCount>
<parallel>methods</parallel>
<forkedProcessExitTimeoutInSeconds>2</forkedProcessExitTimeoutInSeconds>
</configuration>
</plugin>