From 6aaeb31a2ae408275d9309f7946d5324f12093c6 Mon Sep 17 00:00:00 2001 From: Peter Potapov Date: Fri, 17 Jan 2020 20:52:11 +0300 Subject: [PATCH] fixed reruns for workers --- lib/command/workers/runTests.js | 30 +++++++++++++++---- .../data/sandbox/workers/retry_test.worker.js | 11 +++++++ test/runner/run_workers_test.js | 15 ++++++++++ 3 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 test/data/sandbox/workers/retry_test.worker.js diff --git a/lib/command/workers/runTests.js b/lib/command/workers/runTests.js index ba66ebee1..87f06709c 100644 --- a/lib/command/workers/runTests.js +++ b/lib/command/workers/runTests.js @@ -18,7 +18,6 @@ const { getConfig, getTestRoot } = require('../utils'); let stdout = ''; const stderr = ''; - // Requiring of Codecept need to be after tty.getWindowSize is available. const Codecept = require(process.env.CODECEPT_CLASS_PATH || '../../codecept'); @@ -121,14 +120,33 @@ function collectStats() { failures: 0, tests: 0, }; - event.dispatcher.on(event.test.passed, () => { + const failedTests = []; + const runTests = []; + event.dispatcher.on(event.test.passed, (testOrSuite) => { + const id = testOrSuite.id || (testOrSuite.ctx && testOrSuite.ctx.test.id) || 'empty'; + const testIndex = failedTests.findIndex(failed => id === failed); + if (testIndex !== -1) { + failedTests.splice(testIndex, 1); + if (stats.failures > 0) { + stats.failures--; + } + } stats.passes++; }); - event.dispatcher.on(event.test.failed, () => { - stats.failures++; + event.dispatcher.on(event.test.failed, (testOrSuite) => { + const id = testOrSuite.id || (testOrSuite.ctx && testOrSuite.ctx.test.id) || 'empty'; + if (!failedTests.includes(id)) { + failedTests.push(id); + stats.failures++; + } }); - event.dispatcher.on(event.test.finished, () => { - stats.tests++; + event.dispatcher.on(event.test.finished, (testOrSuite) => { + const id = testOrSuite.id || (testOrSuite.ctx && testOrSuite.ctx.test.id) || 'empty'; + const test = runTests.find(runTest => id === runTest); + if (!test) { + runTests.push(id); + stats.tests++; + } }); event.dispatcher.once(event.all.after, () => { sendToParentThread({ event: event.all.after, data: stats }); diff --git a/test/data/sandbox/workers/retry_test.worker.js b/test/data/sandbox/workers/retry_test.worker.js new file mode 100644 index 000000000..074dfeaa1 --- /dev/null +++ b/test/data/sandbox/workers/retry_test.worker.js @@ -0,0 +1,11 @@ +Feature('Workers Retry').retry(3); + +let counter = 0; +Scenario('should pass on third time', (I) => { + counter++; + if (counter < 3) { + throw new Error('worker has failed'); + } + I.say('Hello Workers'); + I.seeThisIsWorker(); +}); diff --git a/test/runner/run_workers_test.js b/test/runner/run_workers_test.js index a9a63bc78..c0970aa00 100644 --- a/test/runner/run_workers_test.js +++ b/test/runner/run_workers_test.js @@ -49,6 +49,21 @@ describe('CodeceptJS Workers Runner', function () { }); }); + it('should pass retried test', function (done) { + if (!semver.satisfies(process.version, '>=11.7.0')) this.skip('not for node version'); + exec(`${codecept_run} 2 --grep "Workers Retry"`, (err, stdout, stderr) => { + stdout.should.include('CodeceptJS'); // feature + stdout.should.include('Running tests in 2 workers'); + stdout.should.include('should pass on third time'); + stdout.should.not.include('this is running inside worker'); + stdout.should.not.include('failed'); + stdout.should.not.include('FAILURES'); + stdout.should.include('1 passed'); + assert(!err); + done(); + }); + }); + it('should show failures when suite is failing', function (done) { if (!semver.satisfies(process.version, '>=11.7.0')) this.skip('not for node version'); exec(`${codecept_run} 2 --grep "Workers Failing"`, (err, stdout, stderr) => {