Executar testes em paralelo para qualquer execução de testes

Serviços do Azure DevOps | Azure DevOps Server 2022 - Azure DevOps Server 2019

A execução de testes para validar as alterações ao código é fundamental para manter a qualidade. Para que a prática de integração contínua seja bem-sucedida, é essencial que tenha um bom conjunto de testes que seja executado com cada compilação. No entanto, à medida que a base de código cresce, o conjunto de testes de regressão tende a crescer e a execução de um teste de regressão completo pode demorar muito tempo. Por vezes, os testes podem ser de execução prolongada. Normalmente, é o caso se escrever testes ponto a ponto. Isto reduz a velocidade com que o valor do cliente pode ser fornecido, uma vez que os pipelines não podem processar compilações com rapidez suficiente.

A execução de testes em paralelo é uma excelente forma de melhorar a eficiência dos pipelines de CI/CD. Isto pode ser feito facilmente ao utilizar a capacidade adicional oferecida pela cloud. Este artigo aborda como pode paralelizar testes com vários agentes para processar tarefas.

Pré-requisito

Familiarize-se com os conceitos de agentes e trabalhos. Cada agente só pode executar uma tarefa de cada vez. Para executar várias tarefas em paralelo, tem de configurar vários agentes. Também precisa de tarefas paralelas suficientes.

Configurar tarefas paralelas

Especifique a estratégia "paralela" no YAML e indique quantas tarefas devem ser despachadas. As variáveis e System.TotalJobsInPhase são adicionadas System.JobPositionInPhase a cada tarefa.

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

Dica

Pode especificar até 99 agentes para aumentar verticalmente os testes para grandes conjuntos de testes.

Cortar o conjunto de testes

Para executar testes em paralelo, primeiro tem de segmentar (ou particionar) o conjunto de testes para que cada setor possa ser executado de forma independente. Por exemplo, em vez de executar um grande conjunto de 1000 testes num único agente, pode utilizar dois agentes e executar 500 testes em paralelo em cada agente. Em alternativa, pode reduzir ainda mais o tempo necessário para executar os testes ao utilizar 8 agentes e executar 125 testes em paralelo em cada agente.

O passo que executa os testes numa tarefa tem de saber que setor de teste deve ser executado. As variáveis e System.TotalJobsInPhase podem ser utilizadas System.JobPositionInPhase para esta finalidade:

  • System.TotalJobsInPhase indica o número total de setores (pode considerar isto como "totalSlices")
  • System.JobPositionInPhase identifica um setor específico (pode considerar isto como "sliceNum")

Se representar todos os ficheiros de teste como uma única matriz dimensional, cada tarefa pode executar um ficheiro de teste indexado em [sliceNum + totalSlices], até que todos os ficheiros de teste sejam executados. Por exemplo, se tiver seis ficheiros de teste e duas tarefas paralelas, a primeira tarefa (segmentação0) executará os ficheiros de teste numerados como 0, 2 e 4 e a segunda tarefa (segmentação1) executará ficheiros de teste numerados como 1, 3 e 5.

6 testes em 2 setores

Se utilizar três tarefas paralelas, a primeira tarefa (segmentação0) executará os ficheiros de teste numerados como 0 e 3, a segunda tarefa (segmentação1) executará os ficheiros de teste numerados 1 e 4 e a terceira tarefa (segmentação2) executará os ficheiros de teste numerados como 2 e 5.

6 testes em 3 setores

Código de exemplo

Este exemplo de .NET Core utiliza --list-tests e --filter parâmetros de dotnet test para segmentar os testes. Os testes são executados com nUnit. Os resultados dos testes criados pela DotNetCoreCLI@2 tarefa de teste são publicados no servidor. Importe (para repositórios do Azure ou Azure DevOps Server) ou fork (para o GitHub) este repositório:

https://github.com/idubnori/ParallelTestingSample-dotnet-core

Este exemplo de Python utiliza um script do PowerShell para segmentar os testes. Os testes são executados com pytest. Os resultados do teste de estilo JUnit criados pelo pytest são publicados no servidor. Importe (para repositórios do Azure ou Azure DevOps Server) ou fork (para o GitHub) este repositório:

https://github.com/PBoraMSFT/ParallelTestingSample-Python

Este exemplo de JavaScript utiliza um script bash para segmentar os testes. Os testes são executados com o mocha runner. Os resultados do teste de estilo JUnit criados pelo mocha são publicados no servidor. Importe (para repositórios do Azure ou Azure DevOps Server) ou fork (para o GitHub) este repositório:

https://github.com/PBoraMSFT/ParallelTestingSample-Mocha

O código de exemplo inclui um ficheiro azure-pipelines.yml na raiz do repositório que pode utilizar para criar um pipeline. Siga todas as instruções em Criar o seu primeiro pipeline para criar um pipeline e veja testar a segmentação em ação.

Combinar paralelismo para testes paralelos em massa

Quando são utilizadas tarefas paralelas num pipeline, o pipeline emprega várias máquinas para executar cada tarefa em paralelo. A maioria dos corredores de teste fornece a capacidade de executar testes em paralelo numa única máquina (normalmente, ao criar vários processos ou threads executados em paralelo). Os dois tipos de paralelismo podem ser combinados para testes paralelos em massa, o que torna os testes em pipelines extremamente eficientes.

Ajuda e suporte