This service tracks failing Mocha or Jasmine tests and Cucumber scenarios executed within the WebdriverIO test framework. It will allow failing or unstable tests or scenarios to be re-run.
- 🔄 Re-run failed Mocha, Jasmine, or Cucumber tests after the main test run completes
- 🥒 Full Cucumber support including scenarios inside
Rule:blocks - 🏷️ Filter out scenarios with specific tags from re-runs
- 🪟 Cross-platform support (generates
rerun.shon Unix,rerun.baton Windows) - ⚙️ Configurable command prefix and custom parameters
| wdio-rerun-service | WebdriverIO |
|---|---|
^2.1.0 |
^8.0.0 || ^9.0.0 |
^2.0.0 |
^8.0.0 |
^1.7.0 |
^7.0.0 |
Note: Version 2.1.0 is backward compatible with WebdriverIO v8 and adds support for v9. All users on v8 or v9 should use the latest 2.x.x version.
The retry logic built into WebdriverIO for Cucumber and Mocha/Jasmine is helpful for handling flaky steps in Cucumber and Mocha/Jasmine. Retrying in each framework has caveats:
- Cucumber: It does not take into account that some steps may not be able to be retried in the middle of a test. Running a step twice may break the rest of the Scenario or it may not be possible in the test context.
- Mocha/Jasmine: The
retrylogic may be applied to an individual test, however, this is still done in real-time and perhaps does not account for temporal issues or network connectivity problems.
The main distinctions of the re-run:
- Will re-run an entire individual Cucumber Scenario and not just a single step
- Enables an entire spec file to be re-run after a main test execution is complete
- May be copied and executed locally (
retrycannot) - Can still be used in conjunction with
retrymethods - Does not require any code change to apply
retrylogic to flaky or problematic tests
It is recommended to take some time to evaluate the options available. A hybrid solution may be the best solution to provide the best real and actionable test results.
Using npm:
npm install wdio-rerun-serviceUsing yarn:
yarn add wdio-rerun-serviceUsing pnpm:
pnpm add wdio-rerun-serviceAfter package installation is complete, add it to services array in wdio.conf.js:
// wdio.conf.js
import RerunService from 'wdio-rerun-service';
export const config = {
// ...
services: [
[RerunService, {
// Re-run service options here...
}]
],
// ...
};Instructions on how to install WebdriverIO can be found in the official documentation.
By design, this service does not automatically re-run failed tests.
After WebdriverIO has completed execution, if failures are found, a re-run script will be generated at rerunScriptPath (default: ./rerun.sh on Unix, ./rerun.bat on Windows).
You can then execute this script manually or integrate it into your CI pipeline.
Set the environment variable DISABLE_RERUN=true to disable the service (useful during re-run execution to prevent infinite loops).
Every team's re-run needs will differ—execution could be based on any number of factors. This is an example of how to accomplish a conditional re-run based on number of failures.
Executes ./rerun.sh if less than 25 failures have been found in the last execution of WebdriverIO.
#!/usr/bin/env bash
MAX_TO_RERUN=${MAX_TO_RERUN:=25}
if [ -f "rerun.sh" ]; then
echo "[rerun.sh] file exists, checking total failures."
NUMBER_OF_FAILURES=$(grep "\-\-spec" -o rerun.sh | wc -l | xargs)
if [ "$MAX_TO_RERUN" -gt "$NUMBER_OF_FAILURES" ]; then
echo "Re-running $NUMBER_OF_FAILURES failed scenarios!"
. ./rerun.sh
else
echo "Skipping re-run, expected < $MAX_TO_RERUN failures."
echo "Got $NUMBER_OF_FAILURES failures."
fi
else
echo "No [rerun.sh] file exists, skipping re-run!"
fiExecute in shell:
. ./attemptRerun.shAdd task in package.json:
"attempt-rerun": ". ./attemptRerun.sh"Execute in shell:
npm run attempt-rerunThe following options may be added to the wdio.conf.js file. To define options for the service you need to add the service to the services list in the following way:
// wdio.conf.js
import RerunService from 'wdio-rerun-service';
export const config = {
// ...
services: [
[RerunService, {
// Re-run service options here...
}]
],
// ...
};Directory where all the re-run JSON data will be kept during execution.
Type: String
Default: ./results/rerun
Example:
import RerunService from 'wdio-rerun-service';
export const config = {
// ...
services: [
[RerunService, {
rerunDataDir: './custom-rerun-directory'
}]
],
// ...
}Path to write the re-run script.
Type: String
Default: ./rerun.sh (Unix) or ./rerun.bat (Windows)
Example:
import RerunService from 'wdio-rerun-service';
export const config = {
// ...
services: [
[RerunService, {
rerunScriptPath: './custom-path-for-rerun.sh'
}]
],
// ...
}(Cucumber-only) Set of Cucumber tags to exclude. If scenario contains a tag, the re-run service will skip analysis.
Type: Array
Default: []
Example:
import RerunService from 'wdio-rerun-service';
export const config = {
// ...
services: [
[RerunService, {
ignoredTags: ['@known_bug']
}]
],
// ...
}Prefix which will be added to the re-run command that is generated.
Type: String
Default: ''
Example:
import RerunService from 'wdio-rerun-service';
export const config = {
// ...
services: [
[RerunService, {
commandPrefix: "VARIABLE=true"
}]
],
// ...
}Parameters which will be added to the re-run command that is generated.
Can be used with commandPrefix.
Type: String
Default: ''
Example:
import RerunService from 'wdio-rerun-service';
export const config = {
// ...
services: [
[RerunService, {
customParameters: "--foobar"
}]
],
// ...
}