Trending
- Reproducible Development Environments, One Command Away: Introducing CodingBooth
- Logging What AI Agents Do in Salesforce: A Simple One-Object Audit Framework
- Self-Hosted Inference Doesn’t Have to Be a Nightmare: How to Use GPUStack
- Production-Grade RAG: Why Vector Search Isn't Enough (and How Hybrid Search Fills the Gaps)
- DZone
- Testing, Deployment, and Maintenance
- DevOps and CI/CD
- Spring Boot Integration Test With Cucumber and Jenkins Pipeline
Spring Boot Integration Test With Cucumber and Jenkins Pipeline
Learn how to integrate the Cucumber framework with Spring Boot integration tests and collect reports in a Jenkins pipeline for behavior-driven testing.
Join the DZone community and get the full member experience.
Join For FreeHere I am sharing how you can integrate Cucumber for behavior driven testing with Spring Boot integration tests, and how you collect the reports in Jenkins pipeline.
In a sample Spring Boot app generated from my custom Spring Boot archetype, we will show a small integration test suite with Cucumber and Spring Boot.
Steps to Follow
1- Add Cucumber maven dependencies to your Spring Boot pom.xml
<!-- Cucumber-->
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-java</artifactId>
<version>${cucumber-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-junit</artifactId>
<version>${cucumber-version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>info.cukes</groupId>
<artifactId>cucumber-spring</artifactId>
<version>${cucumber-version}</version>
<scope>test</scope>
</dependency>
2- Define Cucumber features in your test resources:
👁 Screen Shot 2017-12-03 at 19.00.06
3- How to define the features implementation to be executed with your Spring Boot app logic:
The feature description:
Feature: the health can be retrieved
Scenario: client makes call to GET /health
When the client calls /health
Then the client receives response status code of 200
The feature implementation:
/**
* how the feature is executed
*/
public class GetHealthStep extends CucumberRoot {
private ResponseEntity<String> response; // output
@When("^the client calls /health$")
public void the_client_issues_GET_health() throws Throwable {
response = template.getForEntity("/health", String.class);
}
@Then("^the client receives response status code of (\\d+)$")
public void the_client_receives_status_code_of(int statusCode) throws Throwable {
HttpStatus currentStatusCode = response.getStatusCode();
assertThat("status code is incorrect : " +
response.getBody(), currentStatusCode.value(), is(statusCode));
}
}
4- How to execute the integration test:
You need to configure the root executor with Cucumber runner as the following:
/**
* the main class for cucumber where you configure where the features are defined and which formats of reports needed to be generated
*/
@RunWith(Cucumber.class)
@CucumberOptions(features = {"src/test/resources/features"}, format = {"pretty", "html:target/reports/cucumber/html",
"json:target/cucumber.json", "usage:target/usage.jsonx", "junit:target/junit.xml"})
public class CucumberIntegrationIT {
}
The integration test triggering which will be done via spring boot integration test:
/**
* main spring boot integration test with integration test profile
*/
@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ActiveProfiles("INTEGRATION_TEST")
@ContextConfiguration
public class CucumberRoot {
@Autowired
protected TestRestTemplate template;
@Before
public void before() {
// demo to show how to add custom header Globally for the http request in spring test template , like user header
template.getRestTemplate().setInterceptors(Collections.singletonList((request, body, execution) -> {
request.getHeaders()
.add("userHeader", "user");
return execution.execute(request, body);
}));
}
}
5- How to collect the test reports in the Jenkins pipeline:
stage('Integration tests') {
// Run the maven build
steps {
script {
def mvnHome = tool 'Maven 3.3.9'
if (isUnix()) {
// to skip unit testing execution
sh "'${mvnHome}/bin/mvn' verify -Dunit-tests.skip=true"
} else {
bat(/"${mvnHome}\bin\mvn" verify -Dunit-tests.skip=true/)
}
}
// here cucumber extension will collect the reports for you
cucumber buildStatus: null, fileIncludePattern: '**/cucumber.json', jsonReportDirectory: 'target', sortingMethod: 'ALPHABETICAL'
}
}
The complete working sample is here:
GitHub: https://github.com/Romeh/spring-boot-sample-app
References:
- Cucumber: https://cucumber.io/
- Spring Boot: https://projects.spring.io/spring-boot/
Published at DZone with permission of Mahmoud Romeh. See the original article here.
Opinions expressed by DZone contributors are their own.
Related
-
Spring Boot: JUnit Integration Test
-
How to Interpret the Number of Spring ApplicationContexts in Integration Tests
-
Mastering Shift-Left: The Ultimate Guide to Input Validation in Jenkins Pipelines
-
Actuator Enhancements: Spring Framework 6.2 and Spring Boot 3.4
