Paralleles Ausführen von Tests für jede Test Runner-Instanz

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

Das Ausführen von Tests zum Überprüfen von Änderungen am Code ist der Schlüssel zur Aufrechterhaltung gleichbleibender Qualität. Für den Erfolg der Continuous Integration-Praxis ist es wichtig, dass Sie über eine gute Testsammlung verfügen, die mit jedem Build ausgeführt wird. Mit wachsender Codebasis wächst jedoch auch die Regressionstestsammlung, und das Ausführen eines vollständigen Regressionstests kann viel Zeit in Anspruch nehmen. Manchmal können die Tests selbst zeitintensiv sein – dies ist in der Regel der Fall, wenn Sie umfassende Tests schreiben. Dadurch wird die Geschwindigkeit verringert, in der Wert für Kunden bereitgestellt werden kann, da Pipelines Builds nicht schnell genug verarbeiten können.

Das parallele Ausführen von Tests ist eine hervorragende Möglichkeit, die Effizienz von CI/CD-Pipelines zu verbessern. Dies kann ganz einfach erfolgen, indem Sie sich die zusätzliche Kapazität der Cloud zunutze machen. In diesem Artikel wird erläutert, wie Sie durch die Verwendung mehrerer Agents zum Verarbeiten von Aufträgen Tests parallelisieren können.

Voraussetzung

Machen Sie sich mit den Konzepten von Agents und Aufträgen vertraut. Jeder Agent kann jeweils nur einen Auftrag ausführen. Um mehrere Aufträge parallel auszuführen, müssen Sie mehrere Agents konfigurieren. Außerdem sind genügend Parallelaufträge erforderlich.

Einrichten von Parallelaufträgen

Definieren Sie die parallele Strategie im YAML, und geben Sie an, wie viele Aufträge verteilt werden sollen. Die Variablen System.JobPositionInPhase und System.TotalJobsInPhase werden jedem Auftrag hinzugefügt.

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

Tipp

Sie können bis zu 99 Agents angeben, um Tests für große Testsammlungen hochskalieren zu können.

Aufteilen der Testsammlung

Um Tests parallel auszuführen, müssen Sie zuerst die Testsammlung aufteilen (oder partitionieren), damit jedes Slice unabhängig ausgeführt werden kann. Anstatt beispielsweise eine große Sammlung mit 1.000 Tests auf einem einzelnen Agent auszuführen, können Sie zwei Agents verwenden und 500 Tests parallel für jeden Agent ausführen. Alternativ können Sie die Zeit, die zum Ausführen der Tests benötigt wird, noch weiter reduzieren, indem Sie 8 Agents verwenden und 125 Tests parallel auf jedem Agent ausführen.

Der Schritt, der die Tests in einem Auftrag ausführt, muss wissen, welches Testslice ausgeführt werden soll. Die Variablen System.JobPositionInPhase und System.TotalJobsInPhase können zu diesem Zweck verwendet werden:

  • System.TotalJobsInPhase gibt die Gesamtzahl der Slices an (Sie können sie sich als „totalSlices“ vorstellen)
  • System.JobPositionInPhase identifiziert ein bestimmtes Slice (denkbar als „sliceNum“)

Wenn Sie alle Testdateien als eindimensionales Array darstellen, kann jeder Auftrag eine Testdatei ausführen, die bei [sliceNum + totalSlices] indiziert ist, bis alle Testdateien ausgeführt werden. Wenn Sie beispielsweise über sechs Testdateien und zwei Parallelaufträge verfügen, führt der erste Auftrag (slice0) Testdateien mit den Nummern 0, 2 und 4 aus, und der zweite Auftrag (slice1) führt die Testdateien mit den Nummern 1, 3 und 5 aus.

6 Tests in 2 Slices

Wenn Sie stattdessen drei Parallelaufträge verwenden, führt der erste Auftrag (slice0) die Testdateien mit den Nummern 0 und 3 aus, der zweite Auftrag (slice1) die Testdateien mit den Nummern 1 und 4, und der dritte Auftrag (slice2) führt die Testdateien mit den Nummern 2 und 5 aus.

6 Tests in 3 Slices

Beispielcode

In diesem .NET Core-Beispiel werden --list-tests- und --filter-Parameter von dotnet test verwendet, um die Tests aufzuteilen. Die Tests werden mit NUnit ausgeführt. Die durch DotNetCoreCLI@2-Testtask erstellten Testergebnisse werden dann auf dem Server veröffentlicht. Importieren Sie (in Azure Repos oder Azure DevOps Server) oder forken Sie (in GitHub) dieses Repository:

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

In diesem Python-Beispiel wird ein PowerShell-Skript zum Aufteilen der Tests verwendet. Die Tests werden mit pytest ausgeführt. Von pytest erstellte Testergebnisse im JUnit-Stil werden dann auf dem Server veröffentlicht. Importieren Sie (in Azure Repos oder Azure DevOps Server) oder forken Sie (in GitHub) dieses Repository:

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

In diesem JavaScript-Beispiel wird ein Bash-Skript zum Aufteilen der Tests verwendet. Die Tests werden mit dem Mocha-Runner ausgeführt. Von Mocha erstellte Testergebnisse im JUnit-Stil werden dann auf dem Server veröffentlicht. Importieren Sie (in Azure Repos oder Azure DevOps Server) oder forken Sie (in GitHub) dieses Repository:

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

Der Beispielcode enthält eine azure-pipelines.yml-Datei im Stammverzeichnis des Repositorys, mit der Sie eine Pipeline erstellen können. Befolgen Sie zum Erstellen einer Pipeline alle Anweisungen unter Erstellen Ihrer ersten Pipeline, und sehen Sie sich das Aufteilen von Tests in Aktion an.

Kombinieren von Parallelität für massive parallele Tests

Wenn Parallelaufträge in einer Pipeline verwendet werden, nutzt die Pipeline mehrere Computer, um jeden Auftrag parallel auszuführen. Die meisten Test Runner-Instanzen bieten die Möglichkeit, Tests parallel auf einem einzelnen Computer auszuführen (in der Regel durch Erstellen mehrerer Prozesse oder Threads, die parallel ausgeführt werden). Die beiden Arten von Parallelität können für massiv parallele Tests kombiniert werden, was das Testen in Pipelines äußerst effizient macht.

Hilfe und Support