Search code examples
javamavencucumberjunit5cucumber-jvm

Cucumber / JUnit 5: How to run individual scenarios/features in CLI?


I'm on a project that uses Cucumber 7.11.2 (so with JUnit5) to run tests. I can't get to run individual scenarios or features using CLI.

I read a lot about using commands such as :

mvn test -Dcucumber.features="src/test/resources/features/file.feature"

or

mvn test -Dcucumber.options="src/test/resources/features/file.feature"

but none worked and I get an "Unknown lifecycle error". If I move some quotes around to get :

mvn test -D"cucumber.options=src/test/resources/features/file.feature" 

for example then all tests run.

I suspect either the first two commands worked with older Cucumber versions or I didn't configure my pom.xml right.

Here is my pom.xml :

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>application</artifactId>
    <version>2.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>17</java.version>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <maven.compiler.plugin.version>3.11.0</maven.compiler.plugin.version>

        <allure-junit5.version>2.21.0</allure-junit5.version>
        <junit.jupiter.version>5.9.2</junit.jupiter.version>
        <junit.platform.version>1.9.2</junit.platform.version>
        <assertj-core.version>3.24.2</assertj-core.version>
        <maven.surefire.plugin.version>3.0.0</maven.surefire.plugin.version>
        <log4j.version>2.20.0</log4j.version>
        <slf4j.version>2.0.7</slf4j.version>

        <rest-assured.version>5.3.0</rest-assured.version>
        <slf4j-log4j12.version>2.0.7</slf4j-log4j12.version>
        <aspectj.version>1.9.19</aspectj.version>
        <jackson.version>2.14.2</jackson.version>
        <lombok.version>1.18.26</lombok.version>

        <cucumber.version>7.11.2</cucumber.version>
        <selenium.version>4.8.3</selenium.version>
        <webdrivermanager.version>5.3.2</webdrivermanager.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>io.cucumber</groupId>
                <artifactId>cucumber-bom</artifactId>
                <version>7.11.2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.junit</groupId>
                <artifactId>junit-bom</artifactId>
                <version>5.9.2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!-- Rest Assured dependency | For API Testing -->
        <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>rest-assured</artifactId>
            <version>${rest-assured.version}</version>
        </dependency>
        <!--Junit
        Dependencies | For Test execution-->
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-suite</artifactId>
            <version>${junit.platform.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>${junit.jupiter.version}</version>
            <scope>test</scope>
        </dependency>
        <!--Cucumber
        Dependencies | For Test execution-->
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>${cucumber.version}</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/io.cucumber/cucumber-picocontainer -->
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-picocontainer</artifactId>
            <version>${cucumber.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-junit-platform-engine</artifactId>
            <version>${cucumber.version}</version>
            <scope>test</scope>
        </dependency>

        <!--WebDriver
        Dependency | For UI testing-->

        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>${webdrivermanager.version}</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>${selenium.version}</version>
            <type>pom</type>
        </dependency>
        <!--Allure
        Dependency | For Reporting-->
        <dependency>
            <groupId>io.qameta.allure</groupId>
            <artifactId>allure-junit5</artifactId>
            <version>${allure-junit5.version}</version>
        </dependency>
        <dependency>
            <groupId>io.qameta.allure</groupId>
            <artifactId>allure-rest-assured</artifactId>
            <version>${allure-junit5.version}</version>
        </dependency>
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>${assertj-core.version}</version>
        </dependency>
        <!--Log4J
        Dependency | For Logging-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${maven.surefire.plugin.version}</version>
                <configuration>
                    <testFailureIgnore>false</testFailureIgnore>
                    <argLine>
                        -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
                    </argLine>
                    <systemPropertyVariables>
                        <property>
                            <name>junit.jupiter.extensions.autodetection.enabled</name>
                            <value>true</value>
                        </property>
                    </systemPropertyVariables>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjweaver</artifactId>
                        <version>${aspectj.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
            <plugin>
                <groupId>io.qameta.allure</groupId>
                <artifactId>allure-maven</artifactId>
                <version>2.12.0</version>
                <configuration>
                    <reportVersion>2.4.1</reportVersion>
                </configuration>
            </plugin>
        </plugins>
    </build>


</project>

Update: Running individual features works with IntelliJ interface, not with VSCode.


Solution

  • The first command is the correct one. But it sounds like you have some shell quoting issues. You should look at the details around the "Unknown lifecycle error" to help you deduce how your command got interpreted by your shell.

    Now I would guess that this should work:

    mvn test -D"cucumber.features=src/test/resources/features/file.feature"
    

    But you should use caution when using it. Cucumber may just run twice. Instead you would be better of selecting the tests you want to run through a tag.

    mvn test -D"groups=ExampleTag"
    

    As an aside you've specified a bill of materials (BOM) for both Cucumber and JUnit, so you don't need these explicit versions anymore:

    <version>${junit.platform.version}</version>
    <version>${junit.jupiter.version}</version>
    <version>${cucumber.version}</version>