Overriding Cucumber Option Values
Last updated: November 16, 2023
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.