Paralleles Ausführen von Tests mithilfe der Visual Studio Test-Aufgabe

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. Verwenden Sie hierfür einfach die zusätzliche Kapazität, die die Cloud bietet. In diesem Artikel wird erläutert, wie Sie die Visual Studio Test-Aufgabe so konfigurieren, dass Tests parallel mit mehreren Agents ausgeführt werden.

Voraussetzung

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

Testslicing

Die Visual Studio Test-Aufgabe (Version 2) ist so konzipiert, dass sie nahtlos mit parallelen Auftragseinstellungen funktioniert. Wenn ein Pipelineauftrag, der die Visual Studio Test-Aufgabe enthält (der Einfachheit halber als „VSTest-Aufgabe“ bezeichnet), für die Parallelausführung auf mehreren Agents konfiguriert ist, erkennt er automatisch, dass mehrere Agents beteiligt sind, und er erstellt Testslices, die auf diesen Agents parallel ausgeführt werden können.

Die Aufgabe kann so konfiguriert werden, dass Testslices für unterschiedliche Anforderungen wie das Batching basierend auf der Anzahl von Tests und Agents, den vorherigen Testausführungszeiten oder dem Speicherort von Tests in Assemblys erstellt werden.

Batchoptionen

Diese Optionen werden in den folgenden Abschnitt erläutert.

Einfaches Slicing basierend auf der Anzahl der Tests und Agents

Diese Einstellung verwendet einen einfachen Slicingalgorithmus, um die Anzahl der Tests „T“ auf „N“ Agents aufzuteilen, sodass jeder Agent T/N Tests ausführt. Wenn Ihre Testsammlung beispielsweise 1000 Tests enthält und Sie zwei Agents für Parallelaufträge verwenden, führt jeder Agent 500 Tests aus. Alternativ können Sie die Zeit, die zum Ausführen der Tests benötigt wird, noch weiter reduzieren, indem Sie acht Agents verwenden, die jeweils 125 Tests parallel ausführen.

Diese Option wird in der Regel verwendet, wenn alle Tests ähnliche Ausführungszeiten aufweisen. Wenn Testausführungszeiten nicht ähnlich sind, werden Agents möglicherweise nicht effektiv verwendet, da einige Agents Slices mit mehreren Tests mit langen Ausführungszeiten erhalten können, während andere Agents Slices mit Tests mit kurzen Ausführungszeiten erhalten und entsprechend viel früher fertig sind als die restlichen Agents.

Slicing basierend auf vorherigen Ausführungszeiten von Tests

Diese Einstellung berücksichtigt vorherige Ausführungszeiten zum Erstellen von Testslices, sodass jeder Slice ungefähr die gleiche Ausführungszeit aufweist. Tests mit kurzer Ausführungszeit werden in einem Batch zusammengefasst, während Tests mit langer Ausführungszeit separaten Slices zugeordnet werden.

Diese Option sollte verwendet werden, wenn Tests innerhalb einer Assembly keine Abhängigkeiten aufweisen und nicht auf demselben Agent ausgeführt werden müssen. Sie führt zu einer möglichst effizienten Nutzung der Agents, da jeder Agent die gleiche Menge an Arbeit erhält und alle zum ungefähr gleichen Zeitpunkt fertig sind.

Slicing basierend auf Testassemblys

Diese Einstellung verwendet einen einfachen Slicingalgorithmus, der die Anzahl der Testassemblys (oder Dateien) „A“ auf „N“ Agents aufteilt, sodass jeder Agent Tests von A/N Assemblys ausführt. Die Anzahl der Tests innerhalb einer Assembly wird bei Verwendung dieser Option nicht berücksichtigt. Wenn Ihre Testsammlung beispielsweise zehn Testassemblys enthält und Sie zwei Agents für Parallelaufträge verwenden, erhält jeder Agent fünf Testassemblys, die ausgeführt werden sollen. Sie können Sie die Zeit, die zum Ausführen der Tests benötigt wird, noch weiter reduzieren, indem Sie fünf Agents verwenden, die jeweils zwei Testassemblys ausführen.

Diese Option sollte verwendet werden, wenn Tests in einer Assembly Abhängigkeiten aufweisen oder die Methoden AssemblyInitialize und AssemblyCleanup bzw. ClassInitialize und ClassCleanup zum Verwalten des Status in Ihrem Testcode verwenden.

Paralleles Ausführen von Tests in klassischen Buildpipelines

Wenn Sie über eine große Testsammlung oder Integrationstests mit langen Ausführungszeiten verfügen, die in Ihrer klassischen Buildpipeline ausgeführt werden sollen, führen Sie die folgenden Schritte aus.

Hinweis

Um die Multi-Agent-Funktion in Buildpipelines mit lokalem TFS-Server zu verwenden, müssen Sie TFS 2018 Update 2 oder eine höhere Version verwenden.

  1. Erstellen eines Auftrags mit einem einzelnen Agent: Erstellen Sie Visual Studio-Projekte, und veröffentlichen Sie Buildartefakte mithilfe der auf der folgenden Abbildung gezeigten Aufgaben. Hierbei werden die Standardauftragseinstellungen verwendet (einzelner Agent, keine Parallelaufträge).

    buildJobSingleAgent

  2. Paralleles Ausführen von Tests mit mehreren Agents:

    • Fügen Sie einen Agent-Auftrag hinzu.

      AddAgentJobBuild

    • Konfigurieren Sie den Auftrag so, dass mehrere Agents parallel verwendet werden. Im folgenden Beispiel werden drei Agents verwendet.

      ParallelTestJobBuild

      Tipp

      Bei umfangreichen Paralleltests können Sie bis zu 99 Agents angeben.

    • Fügen Sie dem Auftrag die Aufgabe Buildartefakte herunterladen hinzu. Dieser Schritt ist die Verbindung zwischen dem Buildauftrag und dem Testauftrag und ist erforderlich, um sicherzustellen, dass die im Buildauftrag generierten Binärdateien für die Agents verfügbar sind, die vom Testauftrag zum Ausführen von Tests verwendet werden. Stellen Sie sicher, dass die Aufgabe so festgelegt ist, dass Artefakte heruntergeladen werden, die vom „aktuellen Build“ erstellt wurden. Zudem muss der Artefaktname dem Artefaktnamen entsprechen, der in der Aufgabe Buildartefakte veröffentlichen im Buildauftrag verwendet wird.

      DownloadBuildArtifacts

    • Fügen Sie die Aufgabe Visual Studio Test hinzu, und konfigurieren Sie sie für die Verwendung der erforderlichen Slicingstrategie.

Einrichten von Aufträgen für parallele Tests in YAML-Pipelines

Geben Sie die parallel-Strategie im job an, und legen Sie fest, wie viele Aufträge verteilt werden sollen. Sie können bis zu 99 Agents angeben, um Tests für große Testsammlungen hochskalieren zu können.

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

Weitere Informationen finden Sie unter YAML-Schema: Auftrag.

Paralleles Ausführen von Tests in klassischen Releasepipelines

Führen Sie die folgenden Schritte aus, wenn Sie über eine große Testsammlung oder Funktionstests mit langer Ausführungszeit verfügen, die nach der Bereitstellung Ihrer Anwendung ausgeführt werden sollen. Möglicherweise müssen Sie eine Webanwendung bereitstellen und Selenium-Tests in einem Browser ausführen, um die App-Funktionalität zu überprüfen.

Hinweis

Um die Multi-Agent-Funktion in Releasepipelines mit lokalem TFS-Server zu verwenden, müssen Sie TFS 2017 Update 1 oder eine höhere Version verwenden.

  1. Bereitstellen der App mit einem einzelnen Agent: Verwenden Sie die Azure-Bereitstellung: Erstellen oder aktualisieren Sie die Ressourcengruppe oder die Aufgabe Azure App Service Deploy, um eine Webanwendung in Azure App Services bereitzustellen. Hierbei werden die Standardauftragseinstellungen verwendet (einzelner Agent, keine Parallelaufträge).

    DeployApp1Agent

  2. Paralleles Ausführen von Tests mit mehreren Agents:

    • Fügen Sie einen Agent-Auftrag hinzu.

      AddAgentJobRM

    • Konfigurieren Sie den Auftrag so, dass mehrere Agents parallel verwendet werden. Im folgenden Beispiel werden drei Agents verwendet.

      ParallelTestJobRM

      Tipp

      Bei umfangreichen Paralleltests können Sie bis zu 99 Agents angeben.

    • Fügen Sie alle zusätzlichen Aufgaben hinzu, die ausgeführt werden müssen, bevor die Visual Studio Test-Aufgabe ausgeführt wird. Führen Sie beispielsweise ein PowerShell-Skript aus, um alle Daten einzurichten, die von Ihren Tests benötigt werden.

      Tipp

      Aufträge in Releasepipelines laden standardmäßig alle Artefakte herunter, die mit der Releasepipeline verknüpft sind. Um Zeit zu sparen, können Sie den Auftrag so konfigurieren, dass nur die vom Auftrag benötigten Testartefakte heruntergeladen werden. Web-App-Binärdateien sind beispielsweise für die Ausführung von Selenium-Tests nicht erforderlich, und Sie können den Download überspringen, wenn die App und die Testartefakte separat von Ihrer Buildpipeline veröffentlicht werden.

    • Fügen Sie die Aufgabe Visual Studio Test hinzu, und konfigurieren Sie sie für die Verwendung der erforderlichen Slicingstrategie.

      Tipp

      Wenn Visual Studio nicht auf den Testcomputern installiert ist, können Sie die Installer-Aufgabe für die Visual Studio-Testplattform verwenden, um die erforderliche Version der Testplattform zu erhalten.

Umfangreiche parallele Tests durch Kombinieren paralleler Pipelineaufträge mit paralleler Testausführung

Wenn Parallelaufträge in einer Pipeline verwendet werden, nutzt diese mehrere Computer (Agents), um jeden Auftrag parallel auszuführen. Testframeworks und Runner bieten auch 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). Parallelitätsfeatures können auf mehreren Ebenen kombiniert werden, um umfassende parallele Tests durchführen zu können. Im Kontext der Visual Studio Test-Aufgabe kann Parallelität auf folgende Weise kombiniert werden:

  1. Parallelität durch Testframeworks: Alle modernen Testframeworks wie MSTest V2, NUnit und xUnit bieten die Möglichkeit, Tests parallel auszuführen. In der Regel werden Tests in einer Assembly parallel ausgeführt. Diese Testframeworks werden mit einem Testadapters und dem Testframework sowie dem entsprechenden Adapter mit der Visual Studio-Testplattform verknüpft und arbeiten innerhalb eines Testhostprozesses, den die Visual Studio-Testplattform erstellt, wenn Tests ausgeführt werden. Aus diesem Grund ist die Parallelisierung auf dieser Ebene innerhalb eines Prozesses für alle Frameworks und Adapter möglich.

  2. Parallelität durch die Visual Studio-Testplattform (vstest.console.exe): Die Visual Studio-Testplattform kann Testassemblys parallel ausführen. Benutzer*innen von „vstest.console.exe“ verwenden hierfür die /Parallel-Option. Ein Testhostprozess wird auf jedem verfügbaren Kern gestartet, und Tests werden in einer auszuführenden Assembly übergeben. Dies funktioniert bei jedem Framework mit einem Testadapter für die Visual Studio-Testplattform, da die Parallelisierungseinheit eine Testassembly oder Testdatei ist. In Kombination mit der Parallelität durch Testframeworks (zuvor beschrieben) kann so maximale Parallelisierung erreicht werden, wenn Tests auf einem einzelnen Agent in der Pipeline ausgeführt werden.

  3. Parallelität durch die Visual Studio Test-Aufgabe (VSTest): Die VSTest-Aufgabe unterstützt die parallele Ausführung von Tests auf mehreren Agents (oder Computern). Testslices werden erstellt, und jeder Agent führt jeweils einen Slice aus. Die drei verschiedenen Slicingstrategien führen in Kombination mit der durch die Testplattform und das Testframework ermöglichten Parallelität (wie zuvor beschrieben) zu Folgendem:

    • Slicing basierend auf der Anzahl der Tests und Agents: Hierbei handelt es sich um einfaches Slicing, bei dem Tests in gleich große Slices gruppiert werden. Ein Slice enthält Tests aus einer oder mehreren Assemblys. Die Testausführung auf dem Agent entspricht dann der zuvor unter 1 und 2 beschriebenen Parallelität.

    • Slicing basierend auf vorherigen Ausführungszeiten: Basierend auf den vorherigen Zeitangaben für die Ausführung von Tests und der Anzahl der verfügbaren Agents werden Tests in Slices gruppiert, sodass jeder Slice ungefähr die gleiche Ausführungszeit benötigt. Ein Slice enthält Tests aus einer oder mehreren Assemblys. Die Testausführung auf dem Agent entspricht dann der zuvor unter 1 und 2 beschriebenen Parallelität.

    • Slicing basierend auf Assemblys: Ein Slice ist eine Testassembly und enthält daher Tests, die alle derselben Assembly angehören. Die Ausführung auf dem Agent entspricht dann der zuvor unter 1 und 2 beschriebenen Parallelität. 2 ist jedoch nicht möglich, wenn ein Agent nur eine auszuführende Assembly erhält.

Hilfe und Support