How do I set the path to my Cucumber features using cucumber-junit?

77,910

Solution 1

Take a look at my question here:

You can specify a location on the classpath by setting the feature attribute in the options annotation like

@Cucumber.Options(features="src/test/resources")

Edit:

in new versions code is

@CucumberOptions(features="src/test/resources")

Solution 2

The classpath option is not obvious in the Cucumber documentation (it is not in the JavaDoc either), I ended up inferring it from the CLI documentation (edit: link is dead, can't find an equivalent), which has other location options documented. See the List configuration options section in the docs. It is also not obvious how to get the feature defintions from another module of a multi module Maven projectg.

This is what got me going (running from IDE and command line) in a Maven multi module project.

@CucumberOptions(
        features = {"classpath:product"},
        //...
)
public class RunCukesTest extends AbstractTestNGSpringContextTests {

where my feature files were located in

main-project
    sub-module-1
        src/test/java/com/foo/
            RunCukesTest.java
        src/test/resources/product/
            feature_1.feature
            feature_2.feature
    sub-module-2
        ...

It pleases me not to see src/test/resources in the path. Note that there is no leading / in the path. Using the classpath is less brittle, because the classpath (rather than the current working directory) must be well defined.

Solution 3

You can use

@CucumberOptions(
    format = "pretty",
    tags = {"~@Ignore"},
    features = "src/test/resources/com/"  //refer to Feature file
)

for scan all of feature file in package

Solution 4

Ok, I can only put this on monday morning... The directory layout I used wasn't correct, I forgot to put the cucumber features into subdirectories matching my package structure.

Make sure you create the needed package directories also in src/test/resources/!

Solution 5

Once you use

import cucumber.api.CucumberOptions;

You will need to add the following to your pom.xml, otherwise "mvn test" will not work. And you can only run your tests from the IDE. See: https://github.com/cucumber/cucumber-java-skeleton/blob/master/pom.xml

<properties>
    <java.version>1.7</java.version>
    <junit.version>4.12</junit.version>
    <cucumber.version>1.2.2</cucumber.version>
    <maven.compiler.version>3.3</maven.compiler.version>
</properties>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.version}</version>
            <configuration>
                <encoding>UTF-8</encoding>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <compilerArgument>-Werror</compilerArgument>
            </configuration>
        </plugin>
    </plugins>
</build>
Share:
77,910
cringe
Author by

cringe

Professional Java Developer &amp; Internet Addict

Updated on May 21, 2020

Comments

  • cringe
    cringe almost 4 years

    I try to build my first executable specifications with Java and Maven. I created a simple project with this structure:

    specification
    |-src
      |-test
        |-java
          |-mypackage
            |-MyFeatureTest.java
        |-resources
          |-MyFeature.feature
    

    In the junit test MyFeatureTest.java I have this:

    import org.junit.runner.RunWith;
    import cucumber.junit.Cucumber;
    
    @RunWith(Cucumber.class)
    public class HomepageTest {
    }
    

    Now https://github.com/cucumber/cucumber-jvm/wiki/IDE-support says that I should add the following line:

    @Cucumber.Options(paths={"my/super.feature:34"})
    

    I tried to modify that to

    @Cucumber.Options(paths={"src/test/resources/"})
    

    but the annotation @Cucumber.Options isn't available at all. My pom.xml has this dependencies:

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>info.cukes</groupId>
      <artifactId>cucumber-java</artifactId>
      <version>1.0.0.RC20</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>info.cukes</groupId>
      <artifactId>cucumber-junit</artifactId>
      <version>1.0.0.RC20</version>
      <scope>test</scope>
    </dependency>
    

    Am I missing something?

    Update I was missing something: The cucumber feature file has to be in a subdirectory src/test/resources/mypackage/. Otherwise it won't be picked up by the junit test.

    I can run my feature tests when I put them in the same directory src/main/test/, so it's not a blocker for me. But I'd like to understand the whole setup.

  • Cris Rockwell
    Cris Rockwell almost 9 years
    good suggestion since @Cucumber.Options is deprecated from version 1.1.5 ... xebee.xebia.in/index.php/2014/07/31/…
  • Charlie Seligman
    Charlie Seligman almost 9 years
    Thank you! Was trying @Cucumber.Options which is deprecated
  • Brenda Holloway
    Brenda Holloway almost 9 years
    Another thanks for showing the new @CucumberOptions!
  • Nirmalya
    Nirmalya over 8 years
    How a knowledgebase remains beneficial days after it is created! After about an year, I get stuck with cucumber-scala project of mine (why not enough documentations around?), search frantically and finally reach here to learn that 'Options' is replaced with 'CucumberOptions'! Great stuff. Thanks.
  • Martin Spamer
    Martin Spamer almost 6 years
    This is the correct solution, all the other answers specifying 'src/test/resources' are wrong in the sense, they are brittle will only ever run correctly within an IDE. The use of 'classpath:features' ensure this will work correctly when deployed to a CI build environment.
  • John Mercier
    John Mercier over 4 years
    Thanks for this solution! I suspect the accepted answer is not actually using the classpath at all. In my case we are packaging the tests in a spring-boot application. I'm hoping that using the classpath means the features can be packaged into the executable jar.