[ https://issues.apache.org/jira/browse/SUREFIRE-1724?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16980548#comment-16980548 ]
M.P. Korstanje commented on SUREFIRE-1724: ------------------------------------------ Heya thanks for getting back so quickly. I am going to reply piecemeal. There are quite a few points to touch upon. > AFAIK Cucumber works with classes It is a common misconception - classes are involved but they are not the test. In simple terms cucumber test consists of two parts: a feature file and glue code. The feature file is a plain text file with the .feature suffix. For example: {code:java} Feature: Eating too many cucumbers may not be good for you Eating too much of anything may not be good for you. Scenario: Eating a few is no problem Given Alice is hungry When she eats 3 cucumbers Then she will be full And still hungry{code} The Given/When/Then lines are called steps and part of a scenario. A scenario would be comparable to a single test annotated method in JUnit. To execute a scenario there must be some Java code to make these steps executable. For example: {code:java} public class StepDefinitions { private Person person @Given("Alice is hungry") public void aliceIsHungry(){ person = new Person("Alice") person.setHungry(true); } @When("she eats {int} Cucumbers") public void sheEatsCucumbers(int cucumbers){ person.eat(cucumbers); .... } {code} To execute the Given line Cucumber will invoke the method annotated with "Alice is hungry". To invoke the When line Cucumber will invoke the method annotated with "she eats \{int} Cucumbers", ect. And as you can see the step definition classes are not the tests. The feature file is. > the way how Surefire discovers the classes should be satisfactory It was with with JUnit4. Cucumber would implement a JUnit4 Runner class. For example: {code:java} package io.cucumber.example; import io.cucumber.junit.Cucumber; import org.junit.runner.RunWith; @RunWith(Cucumber.class) public class RunCucumberTest { } {code} However with the Junit Platform there is no need for this class any more. The JUnit Platform implementation of Cucumber will use the ClassPathRoot and other discovery selectors to discover feature files in the selected locations. For now as a work around I'm adding a marker class that will be discovered by Surefire. Cucumber will then scan the package of the annotated class for features. But this is less then ideal - we have this superfluous class that must be present for all the magic to work. {code:java} @Cucumber public class RunCucumberTest { } {code} > Support JUnit Platform DiscoverySelectors > ------------------------------------------ > > Key: SUREFIRE-1724 > URL: https://issues.apache.org/jira/browse/SUREFIRE-1724 > Project: Maven Surefire > Issue Type: Improvement > Reporter: M.P. Korstanje > Priority: Major > > The JUnit Platform defines multiple > [DiscoverySelectors|https://junit.org/junit5/docs/5.0.2/api/org/junit/platform/engine/DiscoverySelector.html] > to discover tests in different locations. This allows TestEngines to > discover tests in classes, the class path root, resource root, files, ect. > Currently Surefire supports TestEngine implementations through the > JUnitPlatformProvider. However the JUnitPlatformProvider only issues > discovery requests for classes that have already been discovered by Surefire. > Additionally if no tests were discovered by Surefire then no test discovery > requests will be issued at all. > This means that Surefire does not fully utilize the discovery capabilities of > the JUnit Platform and makes it impossible to use the JUnitPlatformProvider > for test frameworks that do not have class based tests such as Cucumber. > To make Cucumber work at the very least the class path root discovery > selector would have to be supported. -- This message was sent by Atlassian Jira (v8.3.4#803005)