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

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, il est essentiel que vous disposiez d’une bonne suite de tests qui soit exécutée à chaque build. Toutefois, à mesure que le codebase augmente, la suite de tests de régression a tendance à croître é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 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 de manière fluide 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 entre ces agents.

La tâche peut être configurée pour créer des tranches de test et 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

Les règles sont expliquées dans les sections suivantes.

Découpage simple en fonction du 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 à l’exécution des tests en utilisant huit agents, chaque agent exécutant 125 tests en parallèle.

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

Découpage en fonction du 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 le même temps d’exécution. Les tests courts seront regroupés par lots, tandis que les tests longs 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 de s’exécuter sur le même agent. Elle permet d’utiliser les agents de la façon la plus efficace, car chaque agent obtient la même quantité de « travail » et se termine à peu près en même temps.

Découpage en fonction 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 « N » agents, 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 lorsque cette option est utilisée. 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 encore davantage réduire le temps nécessaire pour exécuter les tests avec cinq agents, qui auront chacun 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 les méthodes AssemblyInitialize et AssemblyCleanup, ou ClassInitialize et ClassCleanup, 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 longs à exécuter dans votre pipeline de build classique, procédez comme suit.

Notes

Pour utiliser la fonctionnalité multiagent dans les pipelines de build avec un serveur TFS local, vous devez utiliser TFS 2018 Mise à jour 2 ou une version ultérieure.

  1. Générer 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. Les paramètres de travail par défaut sont utilisés (agent unique, pas de travaux parallèles).

    buildJobSingleAgent

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

    • Ajoutez un travail d’agent

      AddAgentJobBuild

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

      ParallelTestJobBuild

      Conseil

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

    • Ajoutez une tâche Télécharger les artefacts de build au travail. Cette étape est le lien entre le travail de build et le travail de test, et est nécessaire pour garantir que les fichiers binaires générés dans le travail de build 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 produits 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 le travail de build.

      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 les tests parallèles dans des pipelines YAML

Spécifiez la stratégie parallel dans la job et indiquez le nombre de travaux à distribuer. Vous pouvez spécifier jusqu’à 99 agents et 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 longs tests fonctionnels à 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.

Notes

Pour utiliser la fonctionnalité multiagent dans les pipelines de mise en production avec un serveur TFS local, vous devez utiliser TFS 2017 Mise à jour 1 ou une version ultérieure.

  1. Déployer 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 Déploiement d’Azure App Service pour déployer une application web sur Azure App Services. Les paramètres de travail par défaut sont utilisés (agent unique, pas de travaux parallèles).

    DeployApp1Agent

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

    • Ajoutez un travail d’agent

      AddAgentJobRM

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

      ParallelTestJobRM

      Conseil

      Pour les tests massivement parallèles, vous pouvez spécifier 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

      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 de manière à ce que seuls les artefacts de test requis par le travail soient téléchargés. Par exemple, les fichiers binaires d’application web ne sont pas nécessaires pour exécuter des tests Selenium et leur téléchargement peut être ignoré si votre pipeline de build publie séparément l’application et les artefacts de test.

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

      Conseil

      Si Visual Studio n’est pas installé sur les machines de test, vous pouvez utiliser la tâche Programme d’installation de la plateforme de test Visual Studio pour acquérir la version requise de la plateforme de test.

Tests massivement parallèles 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, celui-ci utilise plusieurs machines (agents) pour exécuter chaque travail en parallèle. Les frameworks de test et les exécuteurs permettent également 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 en couches 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 offrent la possibilité 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 infrastructures de test s’interfacent avec la plateforme de test Visual Studio à 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 que la plateforme de test Visual Studio crée lors de l’exécution des tests. Par conséquent, la parallélisation au niveau de cette couche s’inscrit dans un processus pour tous les frameworks et adaptateurs.

  2. Parallélisme proposé par la plateforme de test Visual Studio (vstest.console.exe). La plateforme de test Visual Studio peut exécuter des assemblys de test en parallèle. Les utilisateurs de vstest.console.exe le reconnaîtront en tant que commutateur /parallel. Pour ce faire, elle lance un processus hôte de test sur chaque cœur disponible et lui confie des tests dans un assembly à exécuter. Cela fonctionne pour toute infrastructure disposant d’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. Combiné au parallélisme offert par les frameworks de test (décrit ci-dessus), cela permet d’atteindre 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), entraînent ce qui suit :

    • Découpage en fonction du 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 d’un ou plusieurs assemblys. L’exécution de test sur l’agent est ensuite conforme au parallélisme décrit aux 1 et 2 ci-dessus.

    • Découpage en fonction du temps d’exécution passé. En fonction des délais 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 le temps d’exécution de chaque tranche est similaire. Une tranche contient des tests d’un ou plusieurs assemblys. L’exécution de test sur l’agent est ensuite conforme au parallélisme décrit aux 1 et 2 ci-dessus.

    • Découpage en fonction 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 aux 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