Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

In this tutorial, we’ll learn three different methods for overriding the Cucumber option values. From a precedence point of view, Cucumber will parse and override options from:

  • system properties, environment variables, and the cucumber.properties file
  • @CucumberOptions annotation
  • CLI arguments

To showcase each method, we’ll run a simple feature file with two scenarios and override the Cucumber tags option.

2. Setup

There is some initial setup we need to do before going through each method. First, let’s add the cucumber-java, cucumber-junit, cucumber-spring, and junit-vintage-engine dependencies:

<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-java</artifactId>
    <version>7.14.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-junit</artifactId>
    <version>7.14.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>io.cucumber</groupId>
    <artifactId>cucumber-spring</artifactId>
    <version>7.14.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.vintage</groupId>
    <artifactId>junit-vintage-engine</artifactId>
    <version>5.10.0</version>
    <scope>test</scope>
</dependency>

Next, let’s implement a simple controller with two endpoints:

@RestController
public class HealthCheckController {

    @GetMapping(path = "/v1/status", produces = APPLICATION_JSON_VALUE)
    public HttpStatus getV1Status() {
        return ResponseEntity.ok().build().getStatusCode();
    }

    @GetMapping(path = "/v2/status", produces = APPLICATION_JSON_VALUE)
    public HttpStatus getV2Status() {
        return ResponseEntity.ok().build().getStatusCode();
    }
}

We can now add the feature file and the two scenarios:

Feature: status endpoints can be verified
    @v1
    Scenario: v1 status is healthy
        When the client calls /v1/status
        Then the client receives 200 status code

    @v2
    Scenario: v2 status is healthy
        When the client calls /v2/status
        Then the client receives 200 status code

Finally, let’s add the required Cucumber glue code:

@When("^the client calls /v1/status")
public void checkV1Status() throws Throwable {
    executeGet("http://localhost:8082/v1/status");
}

@When("^the client calls /v2/status")
public void checkV2Status() throws Throwable {
    executeGet("http://localhost:8082/v2/status");
}

@Then("^the client receives (\\d+) status code$")
public void verifyStatusCode(int statusCode) throws Throwable {
    final HttpStatus currentStatusCode = latestResponse.getStatusCode();
    assertThat(currentStatusCode.value(), is(statusCode));
}

By default, Cucumber runs all scenarios if not specified otherwise. Let’s verify this behavior by running the tests:

mvn test

As expected, both scenarios are executed:

[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0

We’re now ready to go over the three different methods for overriding the Cucumber option values.

3. Using the cucumber.properties File

The first method loads the Cucumber options from system properties, environment variables, and the cucumber.properties file.

Let’s add the cucumber.filter.tags property to the cucumber.properties file:

cucumber.filter.tags=@v1

Running the tests this time will only execute the @v1 scenario:

[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

4. Using the @CucumberOptions Annotation

The second method uses the @CucumberOptions annotation. Let’s add the tags field:

@CucumberOptions(tags = "@v1")

Running the tests one more time will execute only the @v1 scenario:

[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

Note that this method will override any values provided using system properties, environment variables, and values from the cucumber.properties file.

5. Using CLI Arguments

The last method uses the Cucumber CLI runner and the tags argument. Make sure to use the correct classpath so that it includes the compiled classes and resources and all dependencies (including the ones with test scope):

java -cp ... io.cucumber.core.cli.Main --tags @v1

As expected, only the @v1 scenario is executed:

1 Scenarios (1 passed)
2 Steps (2 passed)

Note that this method will override any values provided through the cucumber.properties file or the @CucumberOptions annotation.

6. Conclusion

In this article, we’ve learned three methods to override the Cucumber option values.

The first method considers options provided as system properties, environment variables, and values in the cucumber.properties file. The second method considers options provided as fields in the @CucumberOptions annotation and overrides any options provided by the first method. The last method uses CLI arguments and overrides the options provided using any of the previous methods.

As always, the complete code can be found over on GitHub.

Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE
res – REST with Spring (eBook) (everywhere)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.