Vai al contenuto principale

Sharding

Per impostazione predefinita, WebdriverIO esegue i test in parallelo e punta a un utilizzo ottimale dei core della CPU sulla tua macchina. Per ottenere una parallelizzazione ancora maggiore, puoi scalare ulteriormente l'esecuzione dei test di WebdriverIO eseguendo i test su più macchine contemporaneamente. Chiamiamo questa modalità di funzionamento "sharding".

Sharding dei test tra più macchine​

Per suddividere la suite di test, passa --shard=x/y alla riga di comando. Ad esempio, per dividere la suite in quattro parti, ciascuna delle quali esegue un quarto dei test:

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

Ora, se esegui questi shard in parallelo su computer diversi, la tua suite di test sarà completata quattro volte più velocemente.

Esempio di GitHub Actions​

GitHub Actions supporta la suddivisione dei test tra più job utilizzando l'opzione jobs.<job_id>.strategy.matrix. L'opzione matrix eseguirà un job separato per ogni possibile combinazione delle opzioni fornite.

Il seguente esempio mostra come configurare un job per eseguire i test su quattro macchine in parallelo. Puoi trovare l'intera configurazione della pipeline nel progetto Cucumber Boilerplate.

  • Prima aggiungiamo un'opzione matrix alla nostra configurazione del job con l'opzione shard contenente il numero di shard che vogliamo creare. shard: [1, 2, 3, 4] creerà quattro shard, ciascuno con un numero di shard diverso.
  • Poi eseguiamo i nostri test WebdriverIO con l'opzione --shard ${{ matrix.shard }}/${{ strategy.job-total }}. Questo sarà il nostro comando di test per ogni shard.
  • Infine carichiamo il nostro report di log wdio negli Artifacts di GitHub Actions. Questo renderà i log disponibili nel caso in cui lo shard fallisca.

La pipeline di test è definita come segue:

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

Questo eseguirà tutti gli shard in parallelo, riducendo il tempo di esecuzione dei test di 4:

GitHub Actions example

Vedi il commit 96d444e del progetto Cucumber Boilerplate che ha introdotto lo sharding nella sua pipeline di test, aiutando a ridurre il tempo di esecuzione complessivo da 2:23 min a 1:30 min, una riduzione del 37% 🎉.

Welcome! How can I help?

WebdriverIO AI Copilot