Playwright: paralelismo, fragmentación y reintentos
Este capítulo presenta la estrategia de ejecución paralela, la ejecución por fragmentos y el mecanismo de reintentos de Playwright, para ayudarte a ejecutar de manera eficiente conjuntos de pruebas a gran escala.
Ejecución paralela
Playwright utiliza de forma predeterminada múltiples procesos Worker para ejecutar las pruebas en paralelo, aprovechando al máximo las CPU multinúcleo.
Configuración de fullyParallel
fullyParallelControla si las pruebas dentro del mismo archivo se ejecutan en paralelo.
Ejemplo
export default defineConfig({
fullyParallel: true, // Las pruebas dentro del mismo archivo también se ejecutan en paralelo
});
CuandofullyParallel: falseCuando está en false, las pruebas del mismo archivo se ejecutan en serie, y las de diferentes archivos se ejecutan en paralelo.
CuandofullyParallel: trueCuando está en true, todas las pruebas se ejecutan completamente en paralelo (incluidas las del mismo archivo).
Control de la cantidad de workers
Ejemplo
// Usa 4 Workers
workers: 4,
// Localmente usa el valor predeterminado, en CI usa fijamente 2
workers: process.env.CI ? 2 : undefined,
// Modo de un solo hilo (conveniente para depurar)
workers: 1,
});
Pruebas en serie
Utilizatest.describe.serialFuerza que las pruebas dentro del mismo grupo se ejecuten en serie.
Ejemplo
test.describe.serial('Del registro al inicio de sesión', () => {
test('Paso 1: Registro', async ({ page }) => { /* ... */ });
test('Paso 2: Verificar el correo electrónico', async ({ page }) => { /* ... */ });
test('Paso 3: Iniciar sesión', async ({ page }) => { /* ... */ });
});
Evita en la medida de lo posible el uso de pruebas en serie, ya que rompen el aislamiento de las pruebas.
Si las pruebas necesitan ejecutarse en orden, considera combinar varios pasos en una sola prueba.
Control de paralelismo local
Mediantetest.describe.configurese puede controlar el modo de paralelismo de un solo grupo.
Ejemplo
test.describe.configure({ mode: 'serial' }); // Forzar ejecución en serie
// test.describe.configure({ mode: 'parallel' }); // Forzar ejecución en paralelo
test('A', async () => {});
test('B', async () => {});
});
Ejecución por fragmentos (Sharding)
La fragmentación (Sharding) distribuye las pruebas en varias máquinas de CI para ejecutarlas, reduciendo el tiempo total de ejecución.
Modo de uso
# 机器 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
Combinar informes de fragmentos
Una vez que todas las máquinas hayan terminado de ejecutarse, combina los archivos de informe generados.
# 每台机器生成报告(不自动打开) npx playwright test --shard=1/4 --reporter=blob # 合并所有 blob 报告 npx playwright merge-reports --reporter=html ./all-blob-reports
Configuración de fragmentación en GitHub Actions
Ejemplo
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 }}
Mecanismo de reintentos
Los reintentos (Retries) hacen que las pruebas fallidas se vuelvan a ejecutar automáticamente, mitigando los factores de inestabilidad ocasionales.
Configuración de reintentos
Ejemplo
export default defineConfig({
// Sin reintentos localmente (retroalimentación rápida), 2 reintentos en CI
retries: process.env.CI ? 2 : 0,
});
Configurar reintentos para un solo archivo o grupo
Ejemplo
test.describe.configure({ retries: 3 });
test.describe('Funcionalidad inestable (requiere múltiples reintentos)', () => {
test('Prueba A', async ({ page }) => { /* ... */ });
test('Prueba B', async ({ page }) => { /* ... */ });
});
Estrategia de reintentos
| Estrategia | Descripción |
|---|---|
| Reintentos en el entorno de CI | Sin reintentos localmente (retroalimentación rápida), 2 o 3 reintentos en CI |
| Recopilación de Trace | Junto contrace: 'on-first-retry', solo se registra el Trace durante los reintentos. |
| No abusar de los reintentos | Los reintentos no deben ocultar Bugs reales. Si una prueba falla con frecuencia y solo pasa tras reintentos, se debe corregir la causa raíz. |