Я создал тестовый класс 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
.Никаких настроек или сносов.Чтобы убедиться, что я ничего не делаю, я буквально перевел каждый тест на 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)