Search code examples
kotlincucumber

Why can't JUnit Platform find my cucumber tests?


I am currently running my cucumber scenarios like this with JUnit 4:

@RunWith(Cucumber::class)
@CucumberOptions(
    features = ["src/features"],
    tags = "not @ignored"
)
class RunCucumberTest

I am trying to get the same working on JUnit Platform, and currently have:

@Suite
@IncludeEngines("cucumber")
@SelectDirectories("src/features")
@ConfigurationParameter(key = Constants.PLUGIN_PROPERTY_NAME, value = "pretty")
@ConfigurationParameter(key = Constants.GLUE_PROPERTY_NAME, value = "garden.ephemeral.rocket")
class RunCucumberTest

I have updated the stuff on the Gradle side as well:

tasks.withType<Test> {
    useJUnitPlatform {
        // TODO: Not needed? Doesn't seem to work with or without.
        includeEngines("cucumber")
    }
    jvmArgs("--add-modules=jdk.incubator.vector")
    // Workaround. Gradle does not include enough information to disambiguate
    // between different examples and scenarios.
    // TODO: Move to cucumber.properties?
    systemProperty("cucumber.junit-platform.naming-strategy", "long")
    // TODO: Move to junit-platform.properties?
    systemProperty("junit.jupiter.execution.parallel.enabled", "true")
}

When I run Gradle, the :test task runs, but the test report is empty.

When I try to run the test class from IDEA, I get:

> No tests found for given includes: [garden.ephemeral.rocket.RunCucumberTest](--tests filter)

How do I make this work?

Investigation so far:

  • I also tried moving the features into the resources and using @SelectClasspathResource("features") instead, but got the same result.
  • I tried cloning this project and it does run its scenarios, but everything is written in Java instead of Kotlin. Other than that, everything is mostly the same between the two. That project uses @SelectClasspathResource instead of @SelectDirectories, but I already tried that. I also tried using @SelectDirectories over in that project, and that works too.
  • If I breakpoint inside DiscoverySelectors.selectDirectory, it doesn't seem to stop there. Best guess is, maybe JUnit isn't even finding and running the suite? Or maybe breakpointing inside JUnit just doesn't work.
  • Best current idea is to convert that skeleton project to Kotlin and see if it still runs.

Solution

  • At a glance this doesn't look right:

    useJUnitPlatform {
            // TODO: Not needed? Doesn't seem to work with or without.
            includeEngines("cucumber")
        }
    

    With the @Suite annotation you are using the JUnit Platform Suite engine to kick of the Cucumber engine. By setting the included engines to cucumber you exclude the suite engine from gradles discovery process.

    Note that the skeleton project uses:

    tasks.withType<Test> {
        useJUnitPlatform()
        // Work around. Gradle does not include enough information to disambiguate
        // between different examples and scenarios.
        systemProperty("cucumber.junit-platform.naming-strategy", "long")
    }