There are multiple version of CucumberJS that all differ a bit in the way they log failures. This parser will parse the log based on 2 log lines. That combination will determine if a *.feature
-file needs to be run again.
The 2 log lines are
Failures:
Specs: /path/to/your/featurefile/flaky.feature
.
The Failures
log line is always printed on failed scenario's. The Specs: /path/to/your/featurefile/flaky.feature
is not always printed, due to the capability settings in the Protractor configuration. See here
The following 2 things need to be done to get the parser working
Via the CLI:
// how to use the `cucumber`-parser
protractor-flake --protractor-path=/path/to/protractor --parser cucumber --node-bin node --max-attempts=3 -- path/to/protractor.conf.js
Or programmatically:
var protractorFlake = require('protractor-flake');
// Default Options
protractorFlake({
parser: 'cucumber'
}, function (status, output) {
proces.exit(status)
})
Depending on the version of CucumberJS that is used 1 of the hooks defined below can be used. This can be saved to a file like for example afterHooks.js
. Make sure that this file is required in the protractor.conf.js
file like this
cucumberOpts: {
require: [
'path/to/your/afterHooks.js'
]
}
This will always print the Specs:
in the testoutput when a scenario fails. The parser will filter double specs.
'use strict';
module.exports = function () {
this.After(function (scenarioResult) {
if (scenarioResult.isFailed()) {
// Log the spec to the console for protractor-flake to be able to rerun the failed specs
console.log('Specs:', scenarioResult.getUri());
}
return Promise.resolve();
});
};
'use strict';
const {defineSupportCode} = require('cucumber');
defineSupportCode(({After}) => {
After(function (scenarioResult) {
if (scenarioResult.status === 'failed') {
// Log the spec to the console for protractor-flake to be able to rerun the failed specs
console.log('Specs:', scenarioResult.scenario.uri);
}
return Promise.resolve();
});
});
'use strict';
const {defineSupportCode, Status} = require('cucumber');
defineSupportCode(({After}) => {
After(function (testCase) {
if (testCase.result.status === Status.FAILED) {
// Log the spec to the console for protractor-flake to be able to rerun the failed specs
console.log('Specs:', testCase.sourceLocation.uri);
}
return Promise.resolve();
});
});
Based on the way the capability in Protractor has been configured the Specs:
are printed. See the table below for the results.
// Single
capabilities: {
browserName: 'chrome',
shardTestFiles: true
}
// Multi
multiCapabilities = [
{
browserName: 'chrome',
shardTestFiles: true
},
{
browserName: 'firefox',
shardTestFiles: true
}
]
Capability | shardTestFiles | Feature | Failures | Specs printed |
---|---|---|---|---|
single | true | 1 | true | false |
single | false | 1 | true | false |
single | true | 1 | false | false |
single | false | 1 | false | false |
single | true | >1 | true | TRUE |
single | false | >1 | true | false |
single | true | >1 | false | TRUE |
single | false | >1 | false | false |
multi | true | 1 | true | TRUE |
multi | false | 1 | true | TRUE |
multi | true | 1 | false | TRUE |
multi | false | 1 | false | TRUE |
multi | true | >1 | true | TRUE |
multi | false | >1 | true | FALSE |
multi | true | >1 | false | TRUE |
multi | false | >1 | false | false |