Parallélisation, sharding et nouvelles tentatives avec Playwright

Ce chapitre présente la stratégie d'exécution parallèle de Playwright, le sharding et le mécanisme de nouvelle tentative en cas d'échec, pour vous aider à exécuter efficacement des suites de tests à grande échelle.


Exécution parallèle

Par défaut, Playwright utilise plusieurs processus Worker pour exécuter les tests en parallèle, en tirant pleinement parti des CPU multicœurs.

Configuration de fullyParallel

fullyParallelContrôle si les tests au sein d'un même fichier s'exécutent en parallèle.

Exemple

// Chemin du fichier : playwright.config.ts
export default defineConfig({
  fullyParallel: true,  // Les tests d'un même fichier s'exécutent aussi en parallèle
});

QuandfullyParallel: falseLorsque ..., les tests au sein d'un même fichier s'exécutent en série, tandis que les tests dans des fichiers différents s'exécutent en parallèle.

QuandfullyParallel: trueLorsque ..., tous les tests s'exécutent entièrement en parallèle (y compris ceux d'un même fichier).

Contrôle du nombre de Workers

Exemple

export default defineConfig({
  // Utiliser 4 Workers
  workers: 4,

  // Utiliser la valeur par défaut en local, utiliser une valeur fixe de 2 en CI
  workers: process.env.CI ? 2 : undefined,

  // Mode monothread (pratique pour le débogage)
  workers: 1,
});

Tests en série

Utilisertest.describe.serialForce les tests du même groupe à s'exécuter en série.

Exemple

// Exécution en série — chaque test dépend du résultat du test précédent
test.describe.serial('Inscription utilisateur à la connexion', () => {
  test('Étape 1 : Inscription', async ({ page }) => { /* ... */ });
  test('Étape 2 : Vérification e-mail', async ({ page }) => { /* ... */ });
  test('Étape 3 : Connexion', async ({ page }) => { /* ... */ });
});

Essayez d'éviter d'utiliser des tests en série, car ils rompent l'isolation des tests.

Si les tests doivent s'exécuter dans l'ordre, envisagez de fusionner plusieurs étapes en un seul test.

Contrôle parallèle local

Viatest.describe.configureVous pouvez contrôler le mode parallèle d'un seul groupe.

Exemple

test.describe('Un groupe de tests', () => {
  test.describe.configure({ mode: 'serial' });  // Forcer le mode série
  // test.describe.configure({ mode: 'parallel' }); // Forcer le mode parallèle

  test('A', async () => {});
  test('B', async () => {});
});

Partitionnement

Le sharding répartit les tests sur plusieurs machines CI afin de réduire la durée d'exécution globale.

Utilisation

# 机器 1:运行第 1/4 片
npx playwright test --shard=1/4

# 机器 2:运行第 2/4 片
npx playwright test --shard=2/4

# 机器 3:运行第 3/4 片
npx playwright test --shard=3/4

# 机器 4:运行第 4/4 片
npx playwright test --shard=4/4

Fusion des rapports de shards

Une fois que toutes les machines ont terminé leur exécution, fusionnez les fichiers de rapport générés.

# 每台机器生成报告(不自动打开)
npx playwright test --shard=1/4 --reporter=blob

# 合并所有 blob 报告
npx playwright merge-reports --reporter=html ./all-blob-reports

Configuration des shards dans GitHub Actions

Exemple

# Chemin du fichier : .github/workflows/playwright.yml
jobs
:
  test
:
    strategy
:
      fail-fast
: false
      matrix
:
        shardIndex
: [1, 2, 3, 4]
        shardTotal
: [4]
    steps
:
      - uses
: actions/checkout@v4
      - uses
: actions/setup-node@v4
      - run
: npm ci
      - run
: npx playwright test --shard=${{ matrix.shardIndex }}/${{ matrix.shardTotal }}

Mécanisme de réessai

Les réessais permettent aux tests ayant échoué d'être automatiquement réexécutés, ce qui atténue les facteurs instables occasionnels.

Configuration des réessais

Exemple

// Chemin du fichier : playwright.config.ts
export default defineConfig({
  // Aucun réessai en local (retour rapide), réessayer 2 fois en CI
  retries: process.env.CI ? 2 : 0,
});

Définition des réessais pour un seul fichier ou groupe

Exemple

// Définir les réessais pour l'ensemble du groupe
test.describe.configure({ retries: 3 });

test.describe('Fonctionnalité instable (nécessite plusieurs réessais)', () => {
  test('Test A', async ({ page }) => { /* ... */ });
  test('Test B', async ({ page }) => { /* ... */ });
});

Stratégies de réessai

StratégieDescription
Réessais dans l'environnement CIAucun réessai en local (retour rapide), réessayer 2-3 fois en CI
Collecte des tracesCombiné avectrace: 'on-first-retry', n'enregistrer Trace que lors des tentatives
N'abusez pas des tentativesLes tentatives ne peuvent pas masquer de vrais bugs. Si un test échoue fréquemment et ne réussit qu'après des tentatives, vous devez corriger la cause racine.
Autres extensions