protractor-flake
Version:
A wrapper for protractor to automatically re-run failed specs for a specific number of attempts
78 lines • 3.3 kB
JavaScript
const child_process_1 = require("child_process");
const parsers_1 = require("./parsers");
const parse_options_1 = require("./parse-options");
const logger_1 = require("./logger");
function filterArgs(protractorArgs) {
protractorArgs = protractorArgs.filter((arg) => !/^--(suite|specs)=/.test(arg));
['--suite', '--specs'].forEach((item) => {
let index = protractorArgs.indexOf(item);
if (index !== -1) {
protractorArgs.splice(index, 2);
}
});
return protractorArgs;
}
function noop(status, output) { }
function flake(options = {}, callback = noop) {
let testAttempt = 1;
let parsedOptions = parse_options_1.default(options);
let parser = parsers_1.getParser(parsedOptions.parser);
let logger = new logger_1.default(parsedOptions.color);
function handleTestEnd(status, output = '') {
if (status === 0) {
callback(status, output);
}
else {
if (++testAttempt <= parsedOptions.maxAttempts) {
logger.log('info', `\nUsing ${parser.name} to parse output\n`);
let failedSpecs = parser.parse(output);
logger.log('info', `Re-running tests: test attempt ${testAttempt}\n`);
if (parsedOptions.protractorRetryConfig) {
logger.log('info', `Using provided protractorRetryConfig: ${parsedOptions.protractorRetryConfig}\n`);
}
if (failedSpecs.length === 0) {
logger.log('info', '\nTests failed but no specs were found. All specs will be run again.\n\n');
}
else {
logger.log('info', 'Re-running the following test files:\n');
logger.log('info', failedSpecs.join('\n') + '\n');
}
return startProtractor(failedSpecs, true);
}
callback(status, output);
}
}
function startProtractor(specFiles = [], retry = false) {
let output = '';
let protractorArgs = [parsedOptions.protractorPath].concat(parsedOptions.protractorArgs);
protractorArgs.push('--params.flake.iteration', testAttempt.toString());
if (retry) {
protractorArgs.push('--params.flake.retry', true.toString());
}
if (specFiles.length) {
protractorArgs = filterArgs(protractorArgs);
protractorArgs.push('--specs', specFiles.join(','));
}
if (parsedOptions.protractorRetryConfig && retry) {
protractorArgs.push(parsedOptions.protractorRetryConfig);
}
let protractor = child_process_1.spawn(parsedOptions.nodeBin, protractorArgs, parsedOptions.protractorSpawnOptions);
protractor.stdout.on('data', (buffer) => {
let text = buffer.toString();
logger.protractor(text);
output = output + text;
});
protractor.stderr.on('data', (buffer) => {
let text = buffer.toString();
logger.protractor(text);
output = output + text;
});
protractor.on('exit', function (status) {
handleTestEnd(status, output);
});
}
startProtractor();
}
module.exports = flake;
//# sourceMappingURL=index.js.map
;