Partager via


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

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

L’exécution de tests pour valider les modifications apportées au code est essentielle pour maintenir la qualité. Pour que la pratique d’intégration continue réussisse, il est essentiel que vous disposiez d’une bonne suite de tests exécutée avec chaque build. Toutefois, à mesure que le codebase augmente, la suite de tests de régression a tendance à croître et à exécuter 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 du client peut être fournie, car les pipelines ne peuvent pas traiter les builds suffisamment 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 utiliser facilement la capacité supplémentaire offerte par le cloud. Cet article explique comment vous pouvez 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 peut exécuter un seul travail à la fois. Pour exécuter plusieurs travaux en parallèle, vous devez configurer plusieurs agents. Vous avez également besoin d’un nombre suffisant de travaux parallèles.

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 / Astuce

Vous pouvez spécifier jusqu’à 99 agents pour effectuer un scale-up des 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 segmenter (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 pour exécuter les tests encore plus loin 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 quelle tranche de test doit être exécutée. 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 considérer cela 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é à [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 (tranche0) 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 plutôt trois travaux parallèles, le premier travail (tranche0) 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 (tranche2) 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 et --list-tests paramètres --filter de dotnet test trancher les tests. Les tests sont exécutés à l’aide de NUnit. Les résultats des tests créés par DotNetCoreCLI@2 la tâche de test sont ensuite publiés sur le serveur. Importez (dans Azure Repos ou Azure DevOps Server) ou fork (dans GitHub) ce dépôt :

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

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

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

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

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 de Créer votre premier pipeline pour créer un pipeline et voir le découpage de test en action.

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

Lorsque des travaux parallèles sont utilisés dans un pipeline, le pipeline utilise plusieurs machines pour exécuter chaque travail en parallèle. La plupart des exécuteurs de test offrent la possibilité d’exécuter des tests en parallèle sur une seule machine (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