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
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
// 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
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.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
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
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
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égie | Description |
|---|---|
| Réessais dans l'environnement CI | Aucun réessai en local (retour rapide), réessayer 2-3 fois en CI |
| Collecte des traces | Combiné avectrace: 'on-first-retry', n'enregistrer Trace que lors des tentatives |
| N'abusez pas des tentatives | Les 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. |