Exécuter des tests en parallèle pour n’importe quel exécuteur de test

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2019

L’exécution de tests pour valider les modifications apportées au code est la clé du maintien de la qualité. Pour que la pratique d’intégration continue réussisse, une bonne suite de tests exécutée avec chaque build est essentielle. Toutefois, à mesure que le codebase augmente, la suite de tests de régression a tendance à augmenter également et l’exécution d’un test de régression complet peut prendre beaucoup de temps. Parfois, les tests eux-mêmes peuvent être longs. C’est généralement le cas si vous écrivez des tests de bout en bout. Cela réduit la vitesse à laquelle la valeur client peut être fournie, car les pipelines ne peuvent pas traiter les builds assez rapidement.

L’exécution de tests en parallèle est un excellent moyen d’améliorer l’efficacité des pipelines CI/CD. Pour ce faire, vous pouvez facilement utiliser la capacité supplémentaire offerte par le cloud. Cet article explique comment paralléliser des tests à l’aide de plusieurs agents pour traiter des travaux.

Conditions préalables

Familiarisez-vous avec les concepts des agents et des travaux. Chaque agent ne peut exécuter qu’un seul travail à la fois. Pour exécuter plusieurs travaux en parallèle, vous devez configurer plusieurs agents. Vous avez également besoin de travaux parallèles suffisants.

Configuration de travaux parallèles

Spécifiez la stratégie « parallèle » dans YAML et indiquez le nombre de travaux à distribuer. Les variables System.JobPositionInPhase et System.TotalJobsInPhase sont ajoutées à chaque travail.

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

Conseil

Vous pouvez spécifier jusqu’à 99 agents pour mettre à l’échelle les tests pour les suites de tests volumineuses.

Découpage de la suite de tests

Pour exécuter des tests en parallèle, vous devez d’abord découper (ou partitionner) la suite de tests afin que chaque tranche puisse être exécutée indépendamment. Par exemple, au lieu d’exécuter une grande suite de 1 000 tests sur un seul agent, vous pouvez utiliser deux agents et exécuter 500 tests en parallèle sur chaque agent. Vous pouvez également réduire le temps nécessaire à l’exécution des tests en utilisant 8 agents et en exécutant 125 tests en parallèle sur chaque agent.

L’étape qui exécute les tests dans un travail doit savoir quel segment de test doit être exécuté. Les variables System.JobPositionInPhase et System.TotalJobsInPhase peuvent être utilisées à cet effet :

  • System.TotalJobsInPhase indique le nombre total de tranches (vous pouvez considérer cela comme « totalSlices »)
  • System.JobPositionInPhase identifie une tranche particulière (vous pouvez le considérer comme « sliceNum »)

Si vous représentez tous les fichiers de test sous la forme d’un tableau unidimensionnel, chaque travail peut exécuter un fichier de test indexé sur [sliceNum + totalSlices], jusqu’à ce que tous les fichiers de test soient exécutés. Par exemple, si vous avez six fichiers de test et deux travaux parallèles, le premier travail (segment0) exécute les fichiers de test numérotés 0, 2 et 4, et le deuxième travail (slice1) exécute les fichiers de test numérotés 1, 3 et 5.

6 tests en 2 tranches

Si vous utilisez trois travaux parallèles à la place, le premier travail (slice0) exécute les fichiers de test numérotés 0 et 3, le deuxième travail (slice1) exécute les fichiers de test numérotés 1 et 4, et le troisième travail (slice2) exécute les fichiers de test numérotés 2 et 5.

6 tests en 3 tranches

Exemple de code

Cet exemple .NET Core utilise les paramètres --list-tests et --filter de dotnet test pour découper les tests. Les tests sont exécutés à l’aide de NUnit. Les résultats de test créés par la tâche de test DotNetCoreCLI@2 sont ensuite publiés sur le serveur. Importez (dans Azure Repos ou Azure DevOps Server) ou dupliquer (dans GitHub) ce référentiel :

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

Cet exemple Python utilise un script PowerShell pour découper les tests. Les tests sont exécutés à l’aide de pytest. Les résultats de test de style JUnit créés par pytest sont ensuite publiés sur le serveur. Importez (dans Azure Repos ou Azure DevOps Server) ou dupliquer (dans GitHub) ce référentiel :

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

Cet exemple JavaScript utilise un script bash pour découper les tests. Les tests sont exécutés à l’aide de l’exécuteur mocha. Les résultats de test de style JUnit créés par mocha sont ensuite publiés sur le serveur. Importez (dans Azure Repos ou Azure DevOps Server) ou dupliquer (dans GitHub) ce référentiel :

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

L’exemple de code inclut un fichier azure-pipelines.yml à la racine du référentiel que vous pouvez utiliser pour créer un pipeline. Suivez toutes les instructions dans Créer votre premier pipeline pour créer un pipeline et consultez test de découpage en action.

Combiner le parallélisme pour des tests massivement parallèles

Lorsque des travaux parallèles sont utilisés dans un pipeline, celui-ci utilise plusieurs machines pour exécuter chaque travail en parallèle. La plupart des exécuteurs de tests permettent d’exécuter des tests en parallèle sur un seul ordinateur (généralement en créant plusieurs processus ou threads exécutés en parallèle). Les deux types de parallélisme peuvent être combinés pour des tests massivement parallèles, ce qui rend les tests dans les pipelines extrêmement efficaces.

Aide et support