From 8412d087a2b915cf96a24f71f47819521532d3fe Mon Sep 17 00:00:00 2001 From: Jack Franklin Date: Thu, 11 Jun 2020 10:42:54 +0100 Subject: [PATCH 1/3] chore: upgrade to Mocha v8 Mocha v8 has some nice improvements and also unlocks the potential to have parallel test runs which may speed up CI. --- mocha-config/puppeteer-unit-tests.js | 2 +- package.json | 2 +- test/mocha-utils.js | 58 ++++++++++++++-------------- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/mocha-config/puppeteer-unit-tests.js b/mocha-config/puppeteer-unit-tests.js index 01dcd44e25fea..14403125655f4 100644 --- a/mocha-config/puppeteer-unit-tests.js +++ b/mocha-config/puppeteer-unit-tests.js @@ -18,7 +18,7 @@ const base = require('./base'); module.exports = { ...base, - file: ['./test/mocha-utils.js'], + require: ['./test/mocha-utils.js'], spec: 'test/*.spec.js', // retry twice more, so we run each test up to 3 times if needed. retries: 2, diff --git a/package.json b/package.json index 0384659ee18f2..abfac2c84272f 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "expect": "^25.2.7", "jpeg-js": "^0.3.7", "minimist": "^1.2.0", - "mocha": "^7.1.1", + "mocha": "^8.0.1", "ncp": "^2.0.0", "pixelmatch": "^4.0.2", "pngjs": "^5.0.0", diff --git a/test/mocha-utils.js b/test/mocha-utils.js index 469545e2207a7..903cf14e67acb 100644 --- a/test/mocha-utils.js +++ b/test/mocha-utils.js @@ -176,31 +176,33 @@ exports.setupTestPageAndContextHooks = () => { }); }; -before(async () => { - const { server, httpsServer } = await setupServer(); - - state.puppeteer = puppeteer; - state.defaultBrowserOptions = defaultBrowserOptions; - state.server = server; - state.httpsServer = httpsServer; - state.isFirefox = isFirefox; - state.isChrome = isChrome; - state.isHeadless = isHeadless; - state.puppeteerPath = path.resolve(path.join(__dirname, '..')); -}); - -beforeEach(async () => { - state.server.reset(); - state.httpsServer.reset(); -}); - -after(async () => { - await state.server.stop(); - state.server = null; - await state.httpsServer.stop(); - state.httpsServer = null; -}); - -afterEach(() => { - sinon.restore(); -}); +exports.mochaHooks = { + beforeAll: async () => { + const { server, httpsServer } = await setupServer(); + + state.puppeteer = puppeteer; + state.defaultBrowserOptions = defaultBrowserOptions; + state.server = server; + state.httpsServer = httpsServer; + state.isFirefox = isFirefox; + state.isChrome = isChrome; + state.isHeadless = isHeadless; + state.puppeteerPath = path.resolve(path.join(__dirname, '..')); + }, + + beforeEach: async () => { + state.server.reset(); + state.httpsServer.reset(); + }, + + afterAll: async () => { + await state.server.stop(); + state.server = null; + await state.httpsServer.stop(); + state.httpsServer = null; + }, + + afterEach: () => { + sinon.restore(); + }, +}; From 87f846c173210403eada99c77151357114cf79f9 Mon Sep 17 00:00:00 2001 From: Jack Franklin Date: Thu, 11 Jun 2020 10:46:16 +0100 Subject: [PATCH 2/3] try running in parallel --- mocha-config/puppeteer-unit-tests.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mocha-config/puppeteer-unit-tests.js b/mocha-config/puppeteer-unit-tests.js index 14403125655f4..2be2a898661a0 100644 --- a/mocha-config/puppeteer-unit-tests.js +++ b/mocha-config/puppeteer-unit-tests.js @@ -20,7 +20,8 @@ module.exports = { ...base, require: ['./test/mocha-utils.js'], spec: 'test/*.spec.js', + parallel: !!process.env.CI, // retry twice more, so we run each test up to 3 times if needed. - retries: 2, + retries: process.env.CI ? 2 : 0, timeout: 25 * 1000, }; From 43bcb1004d22431a557c9ee89356657ef9fc7e79 Mon Sep 17 00:00:00 2001 From: Jack Franklin Date: Thu, 11 Jun 2020 11:12:17 +0100 Subject: [PATCH 3/3] fix coverage --- mocha-config/puppeteer-unit-tests.js | 2 +- test/coverage-utils.js | 21 ++++++------ test/mocha-utils.js | 51 +++++++++++++++++----------- 3 files changed, 44 insertions(+), 30 deletions(-) diff --git a/mocha-config/puppeteer-unit-tests.js b/mocha-config/puppeteer-unit-tests.js index 2be2a898661a0..23fb4f8cfa329 100644 --- a/mocha-config/puppeteer-unit-tests.js +++ b/mocha-config/puppeteer-unit-tests.js @@ -20,7 +20,7 @@ module.exports = { ...base, require: ['./test/mocha-utils.js'], spec: 'test/*.spec.js', - parallel: !!process.env.CI, + parallel: process.env.CI && !process.env.COVERAGE, // retry twice more, so we run each test up to 3 times if needed. retries: process.env.CI ? 2 : 0, timeout: 25 * 1000, diff --git a/test/coverage-utils.js b/test/coverage-utils.js index cff80d7e1d3a5..cd490e9f5bc75 100644 --- a/test/coverage-utils.js +++ b/test/coverage-utils.js @@ -102,16 +102,17 @@ const trackCoverage = () => { clearOldCoverage(); const coverageMap = new Map(); - before(() => { - const api = require('../lib/api'); - const events = require('../lib/common/Events'); - for (const [className, classType] of Object.entries(api)) - traceAPICoverage(coverageMap, events, className, classType); - }); - - after(() => { - writeCoverage(coverageMap); - }); + return { + beforeAll: () => { + const api = require('../lib/api'); + const events = require('../lib/common/Events'); + for (const [className, classType] of Object.entries(api)) + traceAPICoverage(coverageMap, events, className, classType); + }, + afterAll: () => { + writeCoverage(coverageMap); + }, + }; }; module.exports = { diff --git a/test/mocha-utils.js b/test/mocha-utils.js index 903cf14e67acb..d72b180304439 100644 --- a/test/mocha-utils.js +++ b/test/mocha-utils.js @@ -140,7 +140,14 @@ global.describeChromeOnly = (...args) => { if (isChrome) return describe(...args); }; -if (process.env.COVERAGE) trackCoverage(); +let coverageHooks = { + beforeAll: () => {}, + afterAll: () => {}, +}; + +if (process.env.COVERAGE) { + coverageHooks = trackCoverage(); +} console.log( `Running unit tests with: @@ -177,30 +184,36 @@ exports.setupTestPageAndContextHooks = () => { }; exports.mochaHooks = { - beforeAll: async () => { - const { server, httpsServer } = await setupServer(); - - state.puppeteer = puppeteer; - state.defaultBrowserOptions = defaultBrowserOptions; - state.server = server; - state.httpsServer = httpsServer; - state.isFirefox = isFirefox; - state.isChrome = isChrome; - state.isHeadless = isHeadless; - state.puppeteerPath = path.resolve(path.join(__dirname, '..')); - }, + beforeAll: [ + async () => { + const { server, httpsServer } = await setupServer(); + + state.puppeteer = puppeteer; + state.defaultBrowserOptions = defaultBrowserOptions; + state.server = server; + state.httpsServer = httpsServer; + state.isFirefox = isFirefox; + state.isChrome = isChrome; + state.isHeadless = isHeadless; + state.puppeteerPath = path.resolve(path.join(__dirname, '..')); + }, + coverageHooks.beforeAll, + ], beforeEach: async () => { state.server.reset(); state.httpsServer.reset(); }, - afterAll: async () => { - await state.server.stop(); - state.server = null; - await state.httpsServer.stop(); - state.httpsServer = null; - }, + afterAll: [ + async () => { + await state.server.stop(); + state.server = null; + await state.httpsServer.stop(); + state.httpsServer = null; + }, + coverageHooks.afterAll, + ], afterEach: () => { sinon.restore();