Partager via


Exécuter des tests en parallèle à l’aide de la tâche de test Visual Studio

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 configurer la tâche de test Visual Studio pour exécuter des tests en parallèle à l’aide de plusieurs agents.

Conditions préalables

Familiarisez-vous avec les concepts des agents et des travaux. 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.

Test de découpage

La tâche de test Visual Studio (version 2) est conçue pour fonctionner en toute transparence avec les paramètres de travail parallèles. Lorsqu’un travail de pipeline qui contient la tâche de test Visual Studio (appelée « tâche VSTest » par souci de simplicité) est configuré pour s’exécuter sur plusieurs agents en parallèle, il détecte automatiquement que plusieurs agents sont impliqués et crée des tranches de test qui peuvent être exécutées en parallèle sur ces agents.

La tâche peut être configurée pour créer des tranches de test pour répondre à différentes exigences, telles que le traitement par lots en fonction du nombre de tests et d’agents, des temps d’exécution des tests précédents ou de l’emplacement des tests dans les assemblys.

Options de traitement par lots

Ces options sont expliquées dans les sections suivantes.

Découpage simple basé sur le nombre de tests et d’agents

Ce paramètre utilise un algorithme de découpage simple pour diviser le nombre de tests « T » sur les agents « N » afin que chaque agent exécute des tests T/N. Par exemple, si votre suite de tests contient 1 000 tests et que vous utilisez deux agents pour les travaux parallèles, chaque agent exécute 500 tests. Vous pouvez également réduire le temps nécessaire pour exécuter les tests encore plus loin en utilisant huit agents, auquel cas chaque agent exécute 125 tests en parallèle.

Cette option est généralement utilisée lorsque tous les tests ont des temps d’exécution similaires. Si les temps d’exécution des tests ne sont pas similaires, les agents peuvent ne pas être utilisés efficacement, car certains agents peuvent recevoir des tranches avec plusieurs tests de longue durée, tandis que d’autres agents peuvent recevoir des tranches avec des tests de courte durée et se terminer beaucoup plus tôt que le reste des agents.

Découpage basé sur le temps d’exécution passé des tests

Ce paramètre considère les temps d’exécution passés pour créer des tranches de tests afin que chaque tranche ait environ la même durée d’exécution. Les tests de courte durée seront regroupés par lots, tandis que les tests de longue durée seront alloués à des tranches distinctes.

Cette option doit être utilisée lorsque les tests au sein d’un assembly n’ont pas de dépendances et n’ont pas besoin d’être exécutés sur le même agent. Cette option entraîne l’utilisation la plus efficace des agents, car chaque agent obtient la même quantité de « travail » et se termine à peu près en même temps.

Découpage basé sur des assemblys de test

Ce paramètre utilise un algorithme de découpage simple qui divise le nombre d’assemblys de test (ou de fichiers) « A » sur les agents « N », afin que chaque agent exécute des tests à partir d’assemblys A/N. Le nombre de tests au sein d’un assembly n’est pas pris en compte lors de l’utilisation de cette option. Par exemple, si votre suite de tests contient dix assemblys de test et que vous utilisez deux agents pour les travaux parallèles, chaque agent reçoit cinq assemblys de test à exécuter. Vous pouvez réduire le temps nécessaire pour exécuter les tests encore plus loin à l’aide de cinq agents, auquel cas chaque agent obtient deux assemblys de test à exécuter.

Cette option doit être utilisée lorsque les tests au sein d’un assembly ont des dépendances ou utilisent AssemblyInitialize et AssemblyCleanup, ou ClassInitializeClassCleanup des méthodes, pour gérer l’état dans votre code de test.

Exécuter des tests en parallèle dans des pipelines de build classiques

Si vous avez une grande suite de tests ou des tests d’intégration de longue durée à exécuter dans votre pipeline de build classique, procédez comme suit.

Note

Pour utiliser la fonctionnalité multi-agent dans les pipelines de build avec un serveur TFS local, vous devez utiliser TFS 2018 Update 2 ou une version ultérieure.

  1. Générez un travail à l’aide d’un seul agent. Générez des projets Visual Studio et publiez des artefacts de build à l’aide des tâches indiquées dans l’image suivante. Cela utilise les paramètres de travail par défaut (agent unique, aucun travail parallèle).

    buildJobSingleAgent

  2. Exécutez des tests en parallèle à l’aide de plusieurs agents :

    • Ajouter un travail d’agent

      AddAgentJobBuild

    • Configurez le travail pour utiliser plusieurs agents en parallèle. L’exemple ici utilise trois agents.

      ParallelTestJobBuild

      Conseil / Astuce

      Pour les tests massivement parallèles, vous pouvez spécifier autant que 99 agents.

    • Ajoutez une tâche Télécharger les artefacts de build au travail. Cette étape est le lien entre le travail de génération et le travail de test, et est nécessaire pour vous assurer que les fichiers binaires générés dans le travail de génération sont disponibles sur les agents utilisés par le travail de test pour exécuter des tests. Vérifiez que la tâche est définie pour télécharger les artefacts générés par la build actuelle et que le nom de l’artefact est identique au nom de l’artefact utilisé dans la tâche Publier les artefacts de build dans la tâche de génération.

      DownloadBuildArtifacts

    • Ajoutez la tâche de test Visual Studio et configurez-la pour utiliser la stratégie de découpage requise.

Configuration de travaux pour des tests parallèles dans des pipelines YAML

Spécifiez la parallel stratégie dans la job stratégie et indiquez le nombre de travaux à distribuer. Vous pouvez spécifier jusqu’à 99 agents pour effectuer un scale-up des tests pour les suites de tests volumineuses.

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

Pour plus d’informations, consultez le schéma YAML - Travail.

Exécuter des tests en parallèle dans des pipelines de mise en production classiques

Procédez comme suit si vous disposez d’une grande suite de tests ou de tests fonctionnels de longue durée à exécuter après le déploiement de votre application. Par exemple, vous pouvez déployer une application web et exécuter des tests Selenium dans un navigateur pour valider la fonctionnalité de l’application.

Note

Pour utiliser la fonctionnalité multi-agent dans les pipelines de mise en production avec un serveur TFS local, vous devez utiliser TFS 2017 Update 1 ou une version ultérieure.

  1. Déployez l’application à l’aide d’un seul agent. Utilisez le déploiement Azure : Créer ou mettre à jour un groupe de ressources ou la tâche Azure App Service Deploy pour déployer une application web sur Azure App Services. Cela utilise les paramètres de travail par défaut (agent unique, aucun travail parallèle).

    DeployApp1Agent

  2. Exécutez des tests en parallèle à l’aide de plusieurs agents :

    • Ajouter un travail d’agent

      AddAgentJobRM

    • Configurez le travail pour utiliser plusieurs agents en parallèle. L’exemple ici utilise trois agents.

      ParallelTestJobRM

      Conseil / Astuce

      Pour les tests massivement parallèles, vous pouvez spécifier autant que 99 agents.

    • Ajoutez toutes les tâches supplémentaires qui doivent s’exécuter avant l’exécution de la tâche de test Visual Studio. Par exemple, exécutez un script PowerShell pour configurer les données requises par vos tests.

      Conseil / Astuce

      Les travaux dans les pipelines de mise en production téléchargent tous les artefacts liés au pipeline de mise en production par défaut. Pour gagner du temps, vous pouvez configurer le travail pour télécharger uniquement les artefacts de test requis par le travail. Par exemple, les fichiers binaires d’application web ne sont pas nécessaires pour exécuter des tests Selenium et les télécharger peuvent être ignorés si l’application et les artefacts de test sont publiés séparément par votre pipeline de build.

    • Ajoutez la tâche de test Visual Studio et configurez-la pour utiliser la stratégie de découpage requise.

      Conseil / Astuce

      Si les machines de test n’ont pas visual Studio installée, vous pouvez utiliser la tâche Visual Studio Test Platform Installer pour acquérir la version requise de la plateforme de test.

Test massivement parallèle en combinant des travaux de pipeline parallèles avec l’exécution de tests parallèles

Lorsque des travaux parallèles sont utilisés dans un pipeline, il utilise plusieurs machines (agents) pour exécuter chaque travail en parallèle. Les frameworks de test et les exécuteurs fournissent également 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 caractéristiques de parallélisme peuvent être combinées de manière superposée pour réaliser des tests massivement parallèles. Dans le contexte de la tâche de test Visual Studio, le parallélisme peut être combiné de la manière suivante :

  1. Parallélisme proposé par les frameworks de test. Toutes les infrastructures de test modernes telles que MSTest v2, NUnit, xUnit et d’autres permettent d’exécuter des tests en parallèle. En règle générale, les tests d’un assembly sont exécutés en parallèle. Ces frameworks de test interface avec la plateforme Visual Studio Test à l’aide d’un adaptateur de test et de l’infrastructure de test, ainsi que l’adaptateur correspondant, et fonctionnent dans un processus hôte de test créé par Visual Studio Test Platform lors de l’exécution des tests. Par conséquent, la parallélisation à cette couche se trouve dans un processus pour tous les frameworks et adaptateurs.

  2. Parallélisme proposé par visual Studio Test Platform (vstest.console.exe). Visual Studio Test Platform peut exécuter des assemblys de test en parallèle. Les utilisateurs de vstest.console.exe reconnaîtront cela comme commutateur /parallel. Il le fait en lançant un processus hôte de test sur chaque cœur disponible et en lui fournissant des tests dans un assembly à exécuter. Cela fonctionne pour n’importe quelle infrastructure qui a un adaptateur de test pour la plateforme de test Visual Studio, car l’unité de parallélisation est un assembly de test ou un fichier de test. Cela, lorsqu’il est combiné avec le parallélisme proposé par les frameworks de test (décrit ci-dessus), fournit le degré maximal de parallélisation lorsque les tests s’exécutent sur un seul agent dans le pipeline.

  3. Parallélisme proposé par la tâche Visual Studio Test (VSTest). La tâche VSTest prend en charge l’exécution de tests en parallèle sur plusieurs agents (ou machines). Les tranches de test sont créées et chaque agent exécute une tranche à la fois. Les trois stratégies de découpage différentes, lorsqu’elles sont combinées avec le parallélisme offert par la plateforme de test et l’infrastructure de test (comme décrit ci-dessus), aboutissent à ce qui suit :

    • Découpage basé sur le nombre de tests et d’agents. Découpage simple où les tests sont regroupés en tranches de taille égale. Une tranche contient des tests à partir d’un ou plusieurs assemblys. Testez l’exécution sur l’agent, puis conforme au parallélisme décrit dans 1 et 2 ci-dessus.

    • Découpage basé sur le temps d’exécution passé. En fonction des minutages précédents pour l’exécution des tests et du nombre d’agents disponibles, les tests sont regroupés en tranches de sorte que chaque tranche nécessite un temps d’exécution approximativement égal. Une tranche contient des tests à partir d’un ou plusieurs assemblys. Testez l’exécution sur l’agent, puis conforme au parallélisme décrit dans 1 et 2 ci-dessus.

    • Découpage basé sur des assemblys. Une tranche est un assembly de test, et contient donc des tests qui appartiennent tous au même assembly. L’exécution sur l’agent est ensuite conforme au parallélisme décrit dans 1 et 2 ci-dessus. Toutefois, 2 peut ne pas se produire si un agent ne reçoit qu’un seul assembly à exécuter.

Aide et support