From 0515eb6ad2259ef71b9215d2f8ca921e9038b2ba Mon Sep 17 00:00:00 2001 From: kobenguyent Date: Thu, 16 May 2024 16:51:31 +0200 Subject: [PATCH 1/3] feat(plugin): coverage with WebDriver - devtools --- lib/helper/WebDriver.js | 2 +- lib/plugin/coverage.js | 35 ++++++++++++- package.json | 4 +- .../codecept.WebDriver.devtools.coverage.js | 49 +++++++++++++++++++ test/plugin/plugin_test.js | 15 ++++++ 5 files changed, 101 insertions(+), 4 deletions(-) create mode 100644 test/acceptance/codecept.WebDriver.devtools.coverage.js diff --git a/lib/helper/WebDriver.js b/lib/helper/WebDriver.js index 82182b3a7..703f9a2be 100644 --- a/lib/helper/WebDriver.js +++ b/lib/helper/WebDriver.js @@ -642,6 +642,7 @@ class WebDriver extends Helper { if (this.options.automationProtocol) { this.puppeteerBrowser = await this.browser.getPuppeteer(); + this.page = (await this.puppeteerBrowser.pages())[0]; } return this.browser; @@ -2731,7 +2732,6 @@ class WebDriver extends Helper { this.recording = true; this.recordedAtLeastOnce = true; - this.page = (await this.puppeteerBrowser.pages())[0]; await this.page.setRequestInterception(true); this.page.on('request', (request) => { diff --git a/lib/plugin/coverage.js b/lib/plugin/coverage.js index 65a6bc22e..176f8cf1d 100644 --- a/lib/plugin/coverage.js +++ b/lib/plugin/coverage.js @@ -11,7 +11,7 @@ const defaultConfig = { outputDir: 'output/coverage', }; -const supportedHelpers = ['Puppeteer', 'Playwright']; +const supportedHelpers = ['Puppeteer', 'Playwright', 'WebDriver']; const v8CoverageHelpers = { Playwright: { @@ -61,6 +61,33 @@ const v8CoverageHelpers = { await coverageReport.add(coverageList); }, }, + WebDriver: { + startCoverage: async (page) => { + await Promise.all([ + page.coverage.startJSCoverage({ + resetOnNavigation: false, + includeRawScriptCoverage: true, + }), + page.coverage.startCSSCoverage({ + resetOnNavigation: false, + }), + ]); + }, + takeCoverage: async (page, coverageReport) => { + const [jsCoverage, cssCoverage] = await Promise.all([ + page.coverage.stopJSCoverage(), + page.coverage.stopCSSCoverage(), + ]); + // to raw V8 script coverage + const coverageList = [...jsCoverage.map((it) => { + return { + source: it.text, + ...it.rawScriptCoverage, + }; + }), ...cssCoverage]; + await coverageReport.add(coverageList); + }, + }, }; /** @@ -109,11 +136,17 @@ module.exports = function (config) { const debug = debugModule(`codeceptjs:plugin:${helperName.toLowerCase()}Coverage`); const helper = helpers[helperName]; + + if (helperName === 'WebDriver' && !helper.config.devtoolsProtocol) throw Error('Coverage is currently supporting the WebDriver running with Devtools protocol.'); + const v8Helper = v8CoverageHelpers[helperName]; const coverageOptions = { ...config, }; + + if (helperName === 'WebDriver') coverageOptions.coverageProvider = 'v8'; + const coverageReport = new CoverageReport(coverageOptions); coverageReport.cleanCache(); diff --git a/package.json b/package.json index cb5b50918..532675898 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ "lodash.merge": "4.6.2", "mkdirp": "1.0.4", "mocha": "10.4.0", - "monocart-coverage-reports": "2.7.4", + "monocart-coverage-reports": "2.7.6", "ms": "2.1.3", "ora-classic": "5.4.2", "pactum": "3.6.7", @@ -179,4 +179,4 @@ "strict": false } } -} \ No newline at end of file +} diff --git a/test/acceptance/codecept.WebDriver.devtools.coverage.js b/test/acceptance/codecept.WebDriver.devtools.coverage.js new file mode 100644 index 000000000..d4f1089cf --- /dev/null +++ b/test/acceptance/codecept.WebDriver.devtools.coverage.js @@ -0,0 +1,49 @@ +const TestHelper = require('../support/TestHelper'); + +module.exports.config = { + tests: './*_test.js', + timeout: 10000, + output: './output', + helpers: { + WebDriver: { + url: TestHelper.siteUrl(), + browser: 'Chromium', + windowSize: '500x700', + devtoolsProtocol: true, + waitForTimeout: 5000, + capabilities: { + chromeOptions: { + args: ['--headless', '--disable-gpu', '--window-size=500,700'], + }, + }, + }, + ScreenshotSessionHelper: { + require: '../support/ScreenshotSessionHelper.js', + outputPath: './output', + }, + Expect: {}, + }, + include: {}, + mocha: {}, + name: 'acceptance', + plugins: { + screenshotOnFail: { + enabled: true, + }, + coverage: { + enabled: true, + debug: true, + name: 'CodeceptJS Coverage Report', + sourceFilter: '**/src/**', + sourcePath: { + 'todomvc-react/': '', + 'todomvc.com/examples/react/': '', + }, + outputDir: 'output/coverage', + }, + }, + gherkin: { + features: './gherkin/*.feature', + steps: ['./gherkin/steps.js'], + }, +}; diff --git a/test/plugin/plugin_test.js b/test/plugin/plugin_test.js index 4255aeda8..4ea880a6c 100644 --- a/test/plugin/plugin_test.js +++ b/test/plugin/plugin_test.js @@ -45,4 +45,19 @@ describe('CodeceptJS plugin', function () { done(); }); }); + + it('should generate the coverage report - WebDriver - Devtools protocol', (done) => { + exec(`${config_run_config('codecept.WebDriver.devtools.coverage.js', '@coverage')} --debug`, (err, stdout) => { + const lines = stdout.split('\n'); + expect(lines).toEqual( + expect.arrayContaining([ + expect.stringContaining('writing output/coverage'), + expect.stringContaining('generated coverage reports:'), + expect.stringContaining('output/coverage/index.html') + ]), + ); + expect(err).toBeFalsy(); + done(); + }); + }); }); From 5a2975d260daa7017dbc44cc401945dc273c86a9 Mon Sep 17 00:00:00 2001 From: kobenguyent Date: Thu, 16 May 2024 16:58:07 +0200 Subject: [PATCH 2/3] feat(plugin): coverage with WebDriver - devtools --- test/plugin/plugin_test.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/plugin/plugin_test.js b/test/plugin/plugin_test.js index 4ea880a6c..2f615d1d5 100644 --- a/test/plugin/plugin_test.js +++ b/test/plugin/plugin_test.js @@ -38,7 +38,8 @@ describe('CodeceptJS plugin', function () { expect(lines).toEqual( expect.arrayContaining([ expect.stringContaining('writing output/coverage'), - expect.stringContaining('generated coverage reports: output/coverage/index.html'), + expect.stringContaining('generated coverage reports:'), + expect.stringContaining('output/coverage/index.html') ]), ); expect(err).toBeFalsy(); From 026fe35978578f4c027613f3dcfcc6200f0d7c16 Mon Sep 17 00:00:00 2001 From: KobeN <7845001+kobenguyent@users.noreply.github.com> Date: Fri, 17 May 2024 06:27:44 +0200 Subject: [PATCH 3/3] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 532675898..10ddb63ff 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ "lodash.merge": "4.6.2", "mkdirp": "1.0.4", "mocha": "10.4.0", - "monocart-coverage-reports": "2.7.6", + "monocart-coverage-reports": "2.8.2", "ms": "2.1.3", "ora-classic": "5.4.2", "pactum": "3.6.7",