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.
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.
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
- Consultez notre page résolution des problèmes
- Obtenez des conseils sur Stack Overflow et de l’aide via la Developer Community