【问题标题】:intermittent concurrent failues with gradle and junitgradle和junit的间歇性并发失败
【发布时间】:2018-10-12 01:29:42
【问题描述】:

我创建了一个 JUnit 测试类,并用 Gradle 运行它,生活还不错。

我在不同的包中创建了另一个 JUnit 测试类,运行了相同的 Gradle 命令,但现在生活变得更糟了。更糟糕的是,它会间歇性地变得更糟。

有时,事情会奏效:

$ gradle clean cleanTest test

> Task :product:java:common:test

package1.DataSourceDetailsUtilsTest > onlyOverrides() PASSED
package1.DataSourceDetailsUtilsTest > onlyDefaults() PASSED
package1.DataSourceDetailsUtilsTest > onlyTenant() PASSED
package1.DataSourceDetailsUtilsTest > package2.UUIDServiceTests.test1() PASSED
package1.DataSourceDetailsUtilsTest > package2.UUIDServiceTests.test2() PASSED
package1.DataSourceDetailsUtilsTest > package2.UUIDServiceTests.test3() PASSED
package1.DataSourceDetailsUtilsTest > package2.UUIDServiceTests.test4() PASSED
package1.DataSourceDetailsUtilsTest > package2.UUIDServiceTests.test5() PASSED
package1.DataSourceDetailsUtilsTest > package2.UUIDServiceTests.test6() PASSED
package1.DataSourceDetailsUtilsTest > package2.UUIDServiceTests.test7() PASSED

BUILD SUCCESSFUL in 3s
21 actionable tasks: 5 executed, 16 up-to-date

即便如此,请注意左侧始终是 package1.DataSourceDetailsUtilsTest,即使这只是测试类中的 1 个。

有时测试会失败:

> Task :product:java:common:test FAILED

package1.DataSourceDetailsUtilsTest > onlyOverrides() PASSED
package1.DataSourceDetailsUtilsTest > onlyDefaults() PASSED
package1.DataSourceDetailsUtilsTest > onlyTenant() PASSED
package2.UUIDServiceTests > initializationError FAILED
    java.lang.AssertionError

4 tests completed, 1 failed

FAILURE: Build failed with an exception.

注意左侧如何正确地从package1.DataSourceDetailsUtilsTest 变为package2.UUIDServiceTests。这是我所期望的。 AssertionError 粘贴在这篇文章的底部。

有时测试失败的方式不同:

> Task :product:java:common:test FAILED

package1.DataSourceDetailsUtilsTest > package2.UUIDServiceTests.test1() PASSED
package1.DataSourceDetailsUtilsTest > onlyTenant() PASSED
package1.DataSourceDetailsUtilsTest > onlyOverrides() PASSED
package1.DataSourceDetailsUtilsTest > onlyDefaults() PASSED
package1.DataSourceDetailsUtilsTest > package2.UUIDServiceTests.test2() SKIPPED
package1.DataSourceDetailsUtilsTest > package2.UUIDServiceTests.test3() SKIPPED
package1.DataSourceDetailsUtilsTest > package2.UUIDServiceTests.test4() SKIPPED                                                                                                                                                                   
Received a completed event for test with unknown id '40.9'. Registered test ids: '[:product:java:common:test, 40.1]'
java.lang.IllegalArgumentException: Received a completed event for test with unknown id '40.9'. Registered test ids: '[:product:java:common:test, 40.1]'
    at org.gradle.api.internal.tasks.testing.results.StateTrackingTestResultProcessor.completed(StateTrackingTestResultProcessor.java:79)
    at org.gradle.api.internal.tasks.testing.results.AttachParentTestResultProcessor.completed(AttachParentTestResultProcessor.java:56)
    at sun.reflect.GeneratedMethodAccessor284.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.dispatch.FailureHandlingDispatch.dispatch(FailureHandlingDispatch.java:29)
    at org.gradle.internal.dispatch.AsyncDispatch.dispatchMessages(AsyncDispatch.java:133)
    at org.gradle.internal.dispatch.AsyncDispatch.access$000(AsyncDispatch.java:34)
    at org.gradle.internal.dispatch.AsyncDispatch$1.run(AsyncDispatch.java:73)
    at org.gradle.internal.operations.CurrentBuildOperationPreservingRunnable.run(CurrentBuildOperationPreservingRunnable.java:42)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    at java.lang.Thread.run(Thread.java:748)
Received a completed event for test with unknown id '40.7'. Registered test ids: '[:product:java:common:test, 40.1]'
java.lang.IllegalArgumentException: Received a completed event for test with unknown id '40.7'. Registered test ids: '[:product:java:common:test, 40.1]'
    at org.gradle.api.internal.tasks.testing.results.StateTrackingTestResultProcessor.completed(StateTrackingTestResultProcessor.java:79)
    at org.gradle.api.internal.tasks.testing.results.AttachParentTestResultProcessor.completed(AttachParentTestResultProcessor.java:56)
    at sun.reflect.GeneratedMethodAccessor284.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
    at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
    at org.gradle.internal.dispatch.FailureHandlingDispatch.dispatch(FailureHandlingDispatch.java:29)
    at org.gradle.internal.dispatch.AsyncDispatch.dispatchMessages(AsyncDispatch.java:133)
    at org.gradle.internal.dispatch.AsyncDispatch.access$000(AsyncDispatch.java:34)
    at org.gradle.internal.dispatch.AsyncDispatch$1.run(AsyncDispatch.java:73)
    at org.gradle.internal.operations.CurrentBuildOperationPreservingRunnable.run(CurrentBuildOperationPreservingRunnable.java:42)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    at java.lang.Thread.run(Thread.java:748)

package2.UUIDServiceTests > initializationError FAILED

java.lang.AssertionError
    Caused by: java.lang.AssertionError

8 tests completed, 1 failed, 3 skipped

同样,请注意左侧是 package1.DataSourceDetailsUtilsTest,即使来自 package2.UUIDServiceTests 的测试是第一个运行的。

这种情况并不罕见。大约 40% 的时间通过,大约 40% 的时间以第一种方式失败,大约 20% 的时间以第二种方式失败

测试类非常简单。只有带有 @Test 注释的 void 方法。没有设置或拆卸。为了确保这不是我在做什么,我将每个测试都更改为休眠 1 秒:Thread.sleep(1000); 并且仍然能够重现该问题。当只有一个测试类时,它似乎总是有效(即,如果我注释掉其中一个类)

经过更多研究,我确实有 junit.jupiter.execution.parallel.enabled=true,如果我将其更改为 false,那么一切都会恢复正常,所以我认为 Gradle 在并发方面做得很糟糕。

不支持吗?

第一次失败场景的 AssertionError:

java.lang.AssertionError
at org.gradle.api.internal.tasks.testing.results.AttachParentTestResultProcessor.started(AttachParentTestResultProcessor.java:33)
at org.gradle.api.internal.tasks.testing.junit.TestClassExecutionEventGenerator.started(TestClassExecutionEventGenerator.java:85)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.actor.internal.DefaultActorFactory$BlockingActor.dispatch(DefaultActorFactory.java:122)
at org.gradle.internal.actor.internal.DefaultActorFactory$BlockingActor.dispatch(DefaultActorFactory.java:97)
at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
at com.sun.proxy.$Proxy2.started(Unknown Source)
at org.gradle.api.internal.tasks.testing.junit.GenericJUnitTestEventAdapter.testStarted(GenericJUnitTestEventAdapter.java:54)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestExecutionListener.executionStarted(JUnitPlatformTestExecutionListener.java:78)
at org.junit.platform.launcher.core.TestExecutionListenerRegistry$CompositeTestExecutionListener.lambda$executionStarted$2(TestExecutionListenerRegistry.java:72)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.junit.platform.launcher.core.TestExecutionListenerRegistry.notifyTestExecutionListeners(TestExecutionListenerRegistry.java:51)
at org.junit.platform.launcher.core.TestExecutionListenerRegistry.access$100(TestExecutionListenerRegistry.java:27)
at org.junit.platform.launcher.core.TestExecutionListenerRegistry$CompositeTestExecutionListener.executionStarted(TestExecutionListenerRegistry.java:72)
at org.junit.platform.launcher.core.ExecutionListenerAdapter.executionStarted(ExecutionListenerAdapter.java:46)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:92)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService$ExclusiveTask.compute(ForkJoinPoolHierarchicalTestExecutorService.java:169)
at java.util.concurrent.RecursiveAction.exec(RecursiveAction.java:189)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:389)
at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:719)
at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService.joinConcurrentTasksInReverseOrderToEnableWorkStealing(ForkJoinPoolHierarchicalTestExecutorService.java:146)
at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService.invokeAll(ForkJoinPoolHierarchicalTestExecutorService.java:120)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:110)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService$ExclusiveTask.compute(ForkJoinPoolHierarchicalTestExecutorService.java:169)
at java.util.concurrent.RecursiveAction.exec(RecursiveAction.java:189)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinTask.doJoin(ForkJoinTask.java:389)
at java.util.concurrent.ForkJoinTask.join(ForkJoinTask.java:719)
at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService.joinConcurrentTasksInReverseOrderToEnableWorkStealing(ForkJoinPoolHierarchicalTestExecutorService.java:146)
at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService.invokeAll(ForkJoinPoolHierarchicalTestExecutorService.java:120)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:110)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:72)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:95)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:71)
at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService$ExclusiveTask.compute(ForkJoinPoolHierarchicalTestExecutorService.java:169)
at java.util.concurrent.RecursiveAction.exec(RecursiveAction.java:189)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

【问题讨论】:

标签: java gradle junit build junit5


【解决方案1】:

似乎使用 gradle 的 junit5 并行测试执行失败,并且有一个 ticket fot。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2017-04-19
    • 1970-01-01
    相关资源
    最近更新 更多