gpt4 book ai didi

java - 如何避免并行运行 Surefire 测试

转载 作者:行者123 更新时间:2023-11-30 02:06:36 27 4
gpt4 key购买 nike

我这里有一个应用程序,其中单元测试的编写方式无法并行运行。

当使用 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

我是否遗漏了插件配置中的某些内容?

更新:

我已经放弃了。这行为太奇怪了。尝试创建简单的示例没有成功。这些测试不是并行运行的。我不明白为什么这里会出现这种情况。我们将修改整个代码以及单元测试。不再需要找到解决方案,但它仍然让我困惑为什么它会表现出这种奇怪的行为......

最佳答案

我只是花了几个小时处理这个问题,最终通过显式地将 forkCount 设置为 1 来解决它。默认值应该是 1,但它的表现肯定不是这样的。

我通过在几个测试用例中打印正在运行的 JVM 的唯一名称(使用 ManagementFactory.getRuntimeMXBean().getName())来确认这一点,每个测试用例都在自己的类中,以及 30 秒的 Thread.sleep() 调用。如果没有显式设置 forkCount,sleep() 不会阻止其他测试用例的执行 - 教学测试明显同时运行,并且 getName() 返回明显不同的值。当我显式地将 forkCount 设置为 1 时,sleep() 按预期调用阻塞执行,并且 getName() 每次都返回相同的值。

另外,只是想添加 @NotThreadSafe 显然是 not working as intended任何一个。我先尝试了一下,但没有成功。

关于java - 如何避免并行运行 Surefire 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51149043/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com