Fragmentación
Por defecto, WebdriverIO ejecuta pruebas en paralelo y se esfuerza por lograr una utilización óptima de los núcleos de CPU en tu máquina. Para lograr una paralelización aún mayor, puedes escalar aún más la ejecución de pruebas de WebdriverIO ejecutando pruebas en múltiples máquinas simultáneamente. Llamamos a este modo de operación "fragmentación" (sharding).
Fragmentación de pruebas entre múltiples máquinas
Para fragmentar el conjunto de pruebas, pasa --shard=x/y
a la línea de comandos. Por ejemplo, para dividir el conjunto en cuatro fragmentos, cada uno ejecutando un cuarto de las pruebas:
npx wdio run wdio.conf.js --shard=1/4
npx wdio run wdio.conf.js --shard=2/4
npx wdio run wdio.conf.js --shard=3/4
npx wdio run wdio.conf.js --shard=4/4
Ahora, si ejecutas estos fragmentos en paralelo en diferentes computadoras, tu conjunto de pruebas se completa cuatro veces más rápido.
Ejemplo de GitHub Actions
GitHub Actions admite fragmentar pruebas entre múltiples trabajos utilizando la opción jobs.<job_id>.strategy.matrix
. La opción matrix ejecutará un trabajo separado para cada posible combinación de las opciones proporcionadas.
El siguiente ejemplo muestra cómo configurar un trabajo para ejecutar tus pruebas en cuatro máquinas en paralelo. Puedes encontrar toda la configuración del pipeline en el proyecto Cucumber Boilerplate.
- Primero, agregamos una opción matrix a nuestra configuración de trabajo con la opción shard que contiene el número de fragmentos que queremos crear.
shard: [1, 2, 3, 4]
creará cuatro fragmentos, cada uno con un número de fragmento diferente. - Luego ejecutamos nuestras pruebas WebdriverIO con la opción
--shard ${{ matrix.shard }}/${{ strategy.job-total }}
. Este será nuestro comando de prueba para cada fragmento. - Finalmente, subimos nuestro informe de registro wdio a los Artefactos de GitHub Actions. Esto hará que los registros estén disponibles en caso de que el fragmento falle.
El pipeline de prueba se define de la siguiente manera:
name: Test
on: [push, pull_request]
jobs:
lint:
# ...
unit:
# ...
e2e:
name: 🧪 Test (${{ matrix.shard }}/${{ strategy.job-total }})
runs-on: ubuntu-latest
needs: [lint, unit]
strategy:
matrix:
shard: [1, 2, 3, 4]
steps:
- uses: actions/checkout@v4
- uses: ./.github/workflows/actions/setup
- name: E2E Test
run: npm run test:features -- --shard ${{ matrix.shard }}/${{ strategy.job-total }}
- uses: actions/upload-artifact@v1
if: failure()
with:
name: logs-${{ matrix.shard }}
path: logs
Esto ejecutará todos los fragmentos en paralelo, reduciendo el tiempo de ejecución de las pruebas por 4:
Consulta el commit 96d444e
del proyecto Cucumber Boilerplate que introdujo la fragmentación en su pipeline de pruebas, lo que ayudó a reducir el tiempo total de ejecución de 2:23 min
a 1:30 min
, una reducción del 37% 🎉.