From 3695f5d096b9cb12d835e080ee911863789904e4 Mon Sep 17 00:00:00 2001 From: Otto Richter Date: Wed, 11 Sep 2024 14:31:46 +0200 Subject: [PATCH] Parallelize playwright tests - allow running with multiple workers (tested with up to four workers locally which didn't show signs of flakiness) - prevent race condition with webauthn tests (running them in parallel on the same user could prevent another test from logging in) - fix flakiness on CI action status (Chromium sometimes needs a long time to fill the href field, firefox is always faster) This reverts commit e8585eff5c997783a5200bf6d9b89c70f1a6a6a1. --- playwright.config.js | 12 ++++-------- tests/e2e/dashboard-ci-status.test.e2e.js | 2 +- tests/e2e/webauthn.test.e2e.js | 6 +++--- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/playwright.config.js b/playwright.config.js index 808e3ca261..25e2a7ab71 100644 --- a/playwright.config.js +++ b/playwright.config.js @@ -11,18 +11,14 @@ export default { testDir: './tests/e2e/', testMatch: /.*\.test\.e2e\.js/, // Match any .test.e2e.js files - /** - * Only run one test at a time, running multiple could lead to a inconsistent - * database state. - */ - fullyParallel: false, - workers: 1, + // you can adjust this value locally to match your machine's power, + // or pass `--workers x` to playwright + workers: process.env.CI ? 1 : 2, /* Maximum time one test can run for. */ timeout: 30 * 1000, expect: { - /** * Maximum time expect() should wait for the condition to be met. * For example in `await expect(locator).toHaveText();` @@ -34,7 +30,7 @@ export default { forbidOnly: Boolean(process.env.CI), /* Retry on CI only */ - retries: process.env.CI ? 2 : 0, + retries: process.env.CI ? 1 : 0, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ reporter: process.env.CI ? 'list' : [['list'], ['html', {outputFolder: 'tests/e2e/reports/', open: 'never'}]], diff --git a/tests/e2e/dashboard-ci-status.test.e2e.js b/tests/e2e/dashboard-ci-status.test.e2e.js index f8b81dc175..1ff68b6334 100644 --- a/tests/e2e/dashboard-ci-status.test.e2e.js +++ b/tests/e2e/dashboard-ci-status.test.e2e.js @@ -16,6 +16,6 @@ test('Correct link and tooltip', async ({browser}, workerInfo) => { const repoStatus = page.locator('.dashboard-repos .repo-owner-name-list > li:nth-child(1) > a:nth-child(2)'); - await expect(repoStatus).toHaveAttribute('href', '/user2/test_workflows/actions'); + await expect(repoStatus).toHaveAttribute('href', '/user2/test_workflows/actions', {timeout: 10000}); await expect(repoStatus).toHaveAttribute('data-tooltip-content', 'Failure'); }); diff --git a/tests/e2e/webauthn.test.e2e.js b/tests/e2e/webauthn.test.e2e.js index 30c92c48f0..e11c17c331 100644 --- a/tests/e2e/webauthn.test.e2e.js +++ b/tests/e2e/webauthn.test.e2e.js @@ -6,12 +6,12 @@ import {expect} from '@playwright/test'; import {test, login_user, load_logged_in_context} from './utils_e2e.js'; test.beforeAll(async ({browser}, workerInfo) => { - await login_user(browser, workerInfo, 'user2'); + await login_user(browser, workerInfo, 'user40'); }); test('WebAuthn register & login flow', async ({browser}, workerInfo) => { test.skip(workerInfo.project.name !== 'chromium', 'Uses Chrome protocol'); - const context = await load_logged_in_context(browser, workerInfo, 'user2'); + const context = await load_logged_in_context(browser, workerInfo, 'user40'); const page = await context.newPage(); // Register a security key. @@ -45,7 +45,7 @@ test('WebAuthn register & login flow', async ({browser}, workerInfo) => { response = await page.goto('/user/login'); await expect(response?.status()).toBe(200); - await page.getByLabel('Username or email address').fill('user2'); + await page.getByLabel('Username or email address').fill('user40'); await page.getByLabel('Password').fill('password'); await page.getByRole('button', {name: 'Sign in'}).click(); await page.waitForURL(`${workerInfo.project.use.baseURL}/user/webauthn`);