3

I use next gradle task configuration

task pipelineTest(type: Test) { Test task ->
task.useJUnitPlatform { org.gradle.api.tasks.testing.junitplatform.JUnitPlatformOptions options ->
    options.includeTags 'integration-test & fast'
}

I expect that test that have both tags integration-test and fast will be executed.

But I've got the build failed Stack trace

org.gradle.api.internal.tasks.testing.TestSuiteExecutionException: Could not complete execution for Gradle Test Executor 6.
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:63)
    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.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy1.stop(Unknown Source)
    at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:123)
    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.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:155)
    at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:137)
    at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
    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)
Caused by: org.junit.platform.commons.util.PreconditionViolationException: Tag name [integration-test & fast] must be syntactically valid
    at org.junit.platform.commons.util.Preconditions.condition(Preconditions.java:295)
    at org.junit.platform.engine.TestTag.<init>(TestTag.java:120)
    at org.junit.platform.engine.TestTag.create(TestTag.java:116)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at org.junit.platform.launcher.TagFilter.toTestTags(TagFilter.java:125)
    at org.junit.platform.launcher.TagFilter.includeTags(TagFilter.java:79)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.addTagsFilter(JUnitPlatformTestClassProcessor.java:134)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.createLauncherDiscoveryRequest(JUnitPlatformTestClassProcessor.java:118)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.access$800(JUnitPlatformTestClassProcessor.java:54)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:92)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$100(JUnitPlatformTestClassProcessor.java:77)
    at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:73)
    at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
Slaw
  • 37,820
  • 8
  • 53
  • 80

3 Answers3

0

You should pass them as separate, coma delimited strings:

options.includeTags 'integration-test', 'fast'
Mureinik
  • 297,002
  • 52
  • 306
  • 350
  • It will run all tests tagged with integration-test and fast. But I'm interested running tests tagged with both 'integration-test' and 'fast'. Also official doccumentation https://junit.org/junit5/docs/current/user-guide/ says that it possible – Vivien Miller Oct 19 '18 at 13:09
0

The presence of the following in the stack trace tells me that you are using a version of JUnit 5 that did not support tag expressions (i.e., x & y).

at org.junit.platform.launcher.TagFilter.toTestTags(TagFilter.java:125)

Thus, if you want to use tag expressions, you'll need to upgrade to JUnit 5.1 or higher.

Sam Brannen
  • 29,611
  • 5
  • 104
  • 136
0

@Tags are a great way to specifically mark a test case. JUnit provides a better way to manage tags execution using includeTags and excludeTags

method.

public int addApple(int apple1, int apple2) {
return apple1 + apple2;
}

test case

@Test
@Tag("add")
void addAppleTestCase1() {
AppleCalculator appleCalculator = new AppleCalculator();
assertEquals(2, appleCalculator.addApple(1, 1), "1 apple + 1 apple is 2 apple");
}


@Test
@Tag("sub")
void subAppleTestCase1() {
AppleCalculator appleCalculator = new AppleCalculator();
assertEquals(1, appleCalculator.subApple(2, 1), "2 apple - 1 apple is 1 apple");
}

build.gradle

test {
testLogging {
events "started", "passed", "skipped", "failed"
}
useJUnitPlatform {
includeTags 'add'
excludeTags 'sub'
}
}


tasks.register("addTests", Test) {
testLogging {
events "started", "passed", "skipped", "failed"
}
useJUnitPlatform {
includeTags 'add'
}
mustRunAfter check
}


tasks.register("subTests", Test) {
testLogging {
events "started", "passed", "skipped", "failed"
}
useJUnitPlatform {
includeTags 'sub'
}
mustRunAfter check
}

to run addTests gradle task

gradle clean addTests

or

./gradlew clean addTests

to run subTests gradle task

gradle clean subTests

or

./gradlew clean subTests
David Buck
  • 3,752
  • 35
  • 31
  • 35