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

// Ruta del archivo: playwright.config.ts
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

export default defineConfig({
  // 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

// Ejecución en serie: cada prueba depende del resultado de la prueba anterior
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('Un grupo de pruebas', () => {
  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

# Ruta del archivo: .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 }}

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

// Ruta del archivo: playwright.config.ts
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

// Configurar reintentos para todo el grupo
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

EstrategiaDescripción
Reintentos en el entorno de CISin reintentos localmente (retroalimentación rápida), 2 o 3 reintentos en CI
Recopilación de TraceJunto contrace: 'on-first-retry', solo se registra el Trace durante los reintentos.
No abusar de los reintentosLos reintentos no deben ocultar Bugs reales. Si una prueba falla con frecuencia y solo pasa tras reintentos, se debe corregir la causa raíz.
Otros temas relacionados