Courgette-JVM is an extension of Cucumber-JVM with added capabilities to run cucumber tests in parallel on a feature level or on a scenario level. It also provides an option to automatically re-run failed scenarios.
<repositories>
<repository>
<id>jcenter</id>
<url>https://jcenter.bintray.com/</url>
</repository>
</repositories>
<dependency>
<groupId>io.github.prashant-ramcharan</groupId>
<artifactId>courgette-jvm</artifactId>
<version>4.6.2</version>
</dependency>
repositories {
jcenter()
}
compile 'io.github.prashant-ramcharan:courgette-jvm:4.6.2'
Example projects:
Courgette-JVM supports JUnit and TestNG to run cucumber features and scenarios in parallel. A JUnit runner class must be annotated with @RunWith(Courgette.class) and a TestNG runner class must extend TestNGCourgette.
threads : The number of concurrent threads to run cucumber features.
runLevel : Options are CourgetteRunLevel.FEATURE or CourgetteRunLevel.SCENARIO
rerunFailedScenarios : If set to true, any failed scenario will be immediately re-run in the same thread. If the re-run succeeds, the initial failure will be ignored and not cause the build to fail.
rerunAttempts : The number of re-run attempts for a failed scenario. (rerunFailedScenarios must be set to true)
showTestOutput : If set to true, the output for each feature will be redirected to the current I/O source or destination.
reportTargetDir : Target directory where courgette-report is generated. Set to target by default.
plugin : Courgette supported plugins
cucumberOptions : The standard cucumber options for specifying feature paths, glue, tags etc..
At the end of the test run, a single report ( if included in the cucumberOptions ) listing all executed features and scenarios will be created in the specified report path. All embedded images will be placed in the images folder in the specified report path.
A courgette-rerun.txt file listing all failed scenarios will be created in the specified rerun plugin path or the target folder ( default )
A Courgette-JVM Html report will be created in the reportTargetDir (defaulted to the target directory).
@RunWith(Courgette.class)
@CourgetteOptions(
threads = 10,
runLevel = CourgetteRunLevel.SCENARIO,
rerunFailedScenarios = true,
rerunAttempts = 1,
showTestOutput = true,
reportTitle = "Courgette-JVM Example",
reportTargetDir = "build",
cucumberOptions = @CucumberOptions(
features = "src/test/resources/features",
glue = "steps",
tags = {"@regression", "not @wip"},
plugin = {
"pretty",
"json:build/cucumber-report/cucumber.json",
"html:build/cucumber-report/cucumber.html",
"junit:build/cucumber-report/cucumber.xml"},
strict = true
))
public class RegressionTestSuite {
}
@Test
@CourgetteOptions(
threads = 10,
runLevel = CourgetteRunLevel.SCENARIO,
rerunFailedScenarios = true,
rerunAttempts = 1,
showTestOutput = true,
reportTitle = "Courgette-JVM Example",
reportTargetDir = "build",
cucumberOptions = @CucumberOptions(
features = "src/test/resources/features",
glue = "steps",
tags = {"@regression", "not @wip"},
plugin = {
"pretty",
"json:build/cucumber-report/cucumber.json",
"html:build/cucumber-report/cucumber.html"},
strict = true
))
public class RegressionTestSuite extends TestNGCourgette {
}
tasks.withType(Test) {
systemProperties = System.getProperties()
systemProperties.remove("java.endorsed.dirs") // needs to be removed from Java 9
}
// JUnit
task regressionSuite(type: Test) {
include '**/RegressionTestSuite.class'
outputs.upToDateWhen { false }
}
// TestNG
task regressionSuite(type: Test) {
useTestNG()
include '**/RegressionTestSuite.class'
outputs.upToDateWhen { false }
}
To override the hard-coded courgette options (threads, runLevel, rerunFailedScenarios, showTestOutput, reportTargetDir) set in the runner class, you can provide system properties to the gradle task.
gradle regressionSuite -Dcourgette.threads=2 -Dcourgette.runLevel=FEATURE -Dcourgette.rerunFailedScenarios=false -Dcourgette.showTestOutput=true -Dcourgette.reportTargetDir=build
To override the hard-coded cucumber options (tags, glue, plugin, name, junit) set in the runner class, you can provide comma separated system properties to the gradle task.
gradle regressionSuite -Dcucumber.tags="@regression, ~@bug" -Dcucumber.glue="steps, hooks"
To specify non standard VM options (-X options)
gradle regressionSuite -Dcourgette.vmoptions="-Xms256m -Xmx512m"
You can add global setup and tear-down code to your Courgette test runner using the @CourgetteBeforeAll
and @CourgetteAfterAll
annotations. For example:
@RunWith(Courgette.class)
@CourgetteOptions(/* Your Courgette options here... */)
public class RegressionTestSuite {
@CourgetteBeforeAll
public static void setUp() {
System.out.println("I will run before any tests execute");
}
@CourgetteAfterAll
public static void tearDown() {
System.out.println("I will run after all of the tests execute");
}
}
You can add any number of annotated methods to your test suite class.
If you need your callbacks to run in a specific order, pass order
to the annotation: @CourgetteBeforeAll(order = 2)
.
Courgette allows test results to be published to the Report Portal server at the end of the test run.
To enable this feature, add the following Courgette option to the Courgette runner:
@CourgetteOptions(
...
plugin = { "reportportal" },
cucumberOptions = @CucumberOptions(
// cucumber options here
)
)
You must have the reportportal.properties file in your classpath and the following properties must be defined:
# Report Portal server (mandatory)
rp.endpoint = http://localhost:8080
# Report Portal project (mandatory)
rp.project = courgette_example
# Report Portal API access token (mandatory)
rp.apitoken=a1e5ee78-317c-477d-b27e-f174c562aedc
# Report Portal launch name (optional)
rp.launch= My Demo Project
# Report Portal test suite (optional)
rp.testsuite= Smoke Test Suite
An API access token is required to allow Courgette to publish the report. To obtain an API access token, log in to Report Portal UI and navigate to http://localhost:8080/ui/#api -> UAT -> sso-endpoint -> Get api token
After the test run is complete, the test results will be published to the Report Portal server.
Courgette allows the creation of interactive reports using the Extent Reports Courgette plugin.
To enable this feature, add the following Courgette option to the Courgette runner:
@CourgetteOptions(
...
plugin = { "extentreports" },
cucumberOptions = @CucumberOptions(
// cucumber options here
)
)
At the end of the test run the report will be saved to ${reportTargetDir}/courgette-extentreports
To configure custom reports (i.e. change the report name or theme) you should create the extent-config.xml
file in the classpath. Courgette will load this XML config when it builds the report. If this file is not provided then default values will be used. View an example here
JUnit test notifier is not updated when running features in the IDE during parallel test execution.
When there's a failure in the feature and your runner is set to 'runLevel = CourgetteRunLevel.FEATURE' and 'rerunFailedScenarios = true', the re-run cucumber feature report will override the original cucumber feature report.
For any issues or requests, please submit here