Este conteúdo foi inicialmente publicado na Newsletter da Talking About Testing.

Uma dúvida que frequentemente surge entre QAs é: “Como configurar um pipeline de integração contínua para rodar testes em paralelo?”

Vou demonstrar uma solução simples utilizando Cypress e GitHub Actions, porém, a mesma idéia pode ser utilizada independente do framework de testes e serviço de integração contínua escolhido.

Obs.: Para que os testes possam ser executados em paralelo, é de extrema importância que sejam independentes uns dos outros (ou ao menos independentes à nível de arquivo).

Ok, agora que isto está esclarecido, o primeiro passo é executar todos os arquivos de teste em sequência para entender (mais ou menos) quanto tempo cada um leva para rodar.

Depois disso, com base no tempo de execução de cada arquivo, recomendo separar as suítes de testes em diferentes lotes (batches), onde cada lote deve possuir arquivos que rodam em tempos semelhantes, para que quando paralelizados, finalizem aproximadamente ao mesmo tempo.

Ou seja, no mundo Cypress, você poderia ter uma estrutura de testes como a seguinte:

- cypress/e2e/
  - batch-1/
  - batch-2/
  - batch-3/
  - batch-4/

E em cada diretório batch-*/ você teria os arquivos de teste (ex.: cypress/e2e/batch-1/login.cy.jscypress/e2e/batch-2/signUp.cy.js, etc).

Então, no arquivo package.json (específico do mundo JavaScript), você pode definir scripts que executem os testes separados por lotes, como demonstrado abaixo.

"scripts": {
  "test:batch-1": "cypress run --spec 'cypress/e2e/batch-1'",
  "test:batch-2": "cypress run --spec 'cypress/e2e/batch-2'",
  "test:batch-3": "cypress run --spec 'cypress/e2e/batch-3'",
  "test:batch-4": "cypress run --spec 'cypress/e2e/batch-4'"
}

Obs.2: Perceba que o caminho dos batches é definido entre aspas simples.

Com isso, você pode então definir seu pipeline de integração contínua, onde cada job execute os lotes em paralelo (veja um exemplo abaixo).

# .github/workflows/parallel.yml
name: End-to-end tests parallel
on: [push]
jobs:
  batch-1:
    runs-on: ubuntu-20.04
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      # Install NPM dependencies, cache them correctly
      # and run Cypress tests from batch 1
      - name: Cypress run
        uses: cypress-io/github-action@v4
        with:
          command: npm run test:batch-1
  batch-2:
    runs-on: ubuntu-20.04
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      # Install NPM dependencies, cache them correctly
      # and run Cypress tests from batch 2
      - name: Cypress run
        uses: cypress-io/github-action@v4
        with:
          command: npm run test:batch-2
  batch-3:
    runs-on: ubuntu-20.04
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      # Install NPM dependencies, cache them correctly
      # and run Cypress tests from batch 3
      - name: Cypress run
        uses: cypress-io/github-action@v4
        with:
          command: npm run test:batch-3
  batch-4:
    runs-on: ubuntu-20.04
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      # Install NPM dependencies, cache them correctly
      # and run Cypress tests from batch 4
      - name: Cypress run
        uses: cypress-io/github-action@v4
        with:
          command: npm run test:batch-4

E assim, quando mudanças forem enviadas ao GitHub, cada lote será executado em paralelo, diminuindo o tempo de execução por 4, provendo feedback rápidos aos times.

É isso aí!

Para um exemplo real, confira este repositório público que criei no GitHub.

E para um vídeo sobre o mesmo assunto, fiz uma Live no Canal Talking About Testing no YouTube, chamada Integração contínua com Cypress e GitHub Actions – feedback rápido através de paralelização.

Espero que tenha aprendido algo novo.


Ficou curioso(a) e quer aprender mais sobre automação de testes com Cypress? Conheça meus cursos no Udemy.


👋  Até a próxima e bons testes!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s