Share via


Tests parallel uitvoeren met behulp van de Visual Studio Test-taak

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

Het uitvoeren van tests voor het valideren van wijzigingen in code is essentieel voor het handhaven van de kwaliteit. Voor een geslaagde continue integratie is het essentieel dat u een goed testpakket hebt dat wordt uitgevoerd bij elke build. Naarmate de codebasis groeit, neemt de regressietestsuite echter ook toe en kan het uitvoeren van een volledige regressietest lang duren. Soms kunnen tests zelf lang duren. Dit is meestal het geval als u end-to-end-tests schrijft. Dit vermindert de snelheid waarmee de klantwaarde kan worden geleverd, omdat pijplijnen builds niet snel genoeg kunnen verwerken.

Het parallel uitvoeren van tests is een uitstekende manier om de efficiëntie van CI/CD-pijplijnen te verbeteren. Dit kan eenvoudig worden gedaan door gebruik te maken van de extra capaciteit die door de cloud wordt aangeboden. In dit artikel wordt beschreven hoe u de Visual Studio Test-taak kunt configureren om tests parallel uit te voeren met behulp van meerdere agents.

Vereiste

Raak vertrouwd met de concepten van agents en taken. Als u meerdere taken parallel wilt uitvoeren, moet u meerdere agents configureren. U hebt ook voldoende parallelle taken nodig.

Segmentering testen

De Visual Studio Test-taak (versie 2) is ontworpen om naadloos te werken met parallelle taakinstellingen. Wanneer een pijplijntaak met de Visual Studio-testtaak (de 'VSTest-taak' voor het gemak) is geconfigureerd om parallel te worden uitgevoerd op meerdere agents, wordt automatisch gedetecteerd dat er meerdere agents betrokken zijn en testsegmenten worden gemaakt die parallel kunnen worden uitgevoerd op deze agents.

De taak kan worden geconfigureerd om testsegmenten te maken die voldoen aan verschillende vereisten, zoals batchverwerking op basis van het aantal tests en agents, de vorige testuitvoeringstijden of de locatie van tests in assembly's.

Batchopties

Deze opties worden uitgelegd in de volgende secties.

Eenvoudige segmentering op basis van het aantal tests en agents

Deze instelling maakt gebruik van een eenvoudig segmenteringsalgoritme om het aantal tests 'T' over N-agents op te delen, zodat elke agent T/N-tests uitvoert. Als uw testpakket bijvoorbeeld 1000 tests bevat en u twee agents gebruikt voor parallelle taken, voert elke agent 500 tests uit. Of u kunt de hoeveelheid tijd die nodig is om de tests nog verder uit te voeren verminderen door acht agents te gebruiken. In dat geval voert elke agent 125 tests parallel uit.

Deze optie wordt meestal gebruikt wanneer alle tests vergelijkbare uitvoeringstijden hebben. Als de testuitvoeringstijden niet vergelijkbaar zijn, worden agents mogelijk niet effectief gebruikt omdat sommige agents segmenten met verschillende langlopende tests ontvangen, terwijl andere agents segmenten met kortlopende tests kunnen ontvangen en veel eerder eindigen dan de rest van de agents.

Segmentering op basis van de afgelopen uitvoering van tests

Deze instelling beschouwt eerdere uitvoeringstijden om segmenten van tests te maken, zodat elk segment ongeveer dezelfde looptijd heeft. Kortlopende tests worden samengevoegd, terwijl langlopende tests worden toegewezen aan afzonderlijke segmenten.

Deze optie moet worden gebruikt wanneer tests binnen een assembly geen afhankelijkheden hebben en niet hoeven te worden uitgevoerd op dezelfde agent. Deze optie resulteert in het meest efficiënte gebruik van agents, omdat elke agent dezelfde hoeveelheid 'werk' krijgt en allemaal ongeveer op hetzelfde moment eindigt.

Segmentering op basis van testassembly's

Deze instelling maakt gebruik van een eenvoudig segmenteringsalgoritme waarmee het aantal testassembly's (of bestanden) 'A' over N-agents wordt verdeeld, zodat elke agent tests uitvoert vanuit A/N-assembly's. Het aantal tests binnen een assembly wordt niet meegenomen bij het gebruik van deze optie. Als uw testsuite bijvoorbeeld tien testassembly's bevat en u twee agents gebruikt voor parallelle taken, ontvangt elke agent vijf testassembly's die moeten worden uitgevoerd. U kunt de hoeveelheid tijd die nodig is om de tests nog verder uit te voeren verminderen door vijf agents te gebruiken. In dat geval krijgt elke agent twee testassembly's die moeten worden uitgevoerd.

Deze optie moet worden gebruikt wanneer tests binnen een assembly afhankelijkheden hebben of gebruikmaken AssemblyInitialize van en AssemblyCleanup, of ClassInitialize en ClassCleanup methoden, om de status in uw testcode te beheren.

Tests parallel uitvoeren in klassieke build-pijplijnen

Als u een groot testpakket of langlopende integratietests hebt om uit te voeren in uw klassieke build-pijplijn, gebruikt u de volgende stappen.

Notitie

Als u de mogelijkheid voor meerdere agents in build-pijplijnen met een on-premises TFS-server wilt gebruiken, moet u TFS 2018 Update 2 of een latere versie gebruiken.

  1. Bouwtaak met één agent. Bouw Visual Studio-projecten en publiceer buildartefacten met behulp van de taken die worden weergegeven in de volgende afbeelding. Hiervoor worden de standaardtaakinstellingen (één agent, geen parallelle taken) gebruikt.

    buildJobSingleAgent

  2. Voer tests parallel uit met behulp van meerdere agents:

    • Een agenttaak toevoegen

      AddAgentJobBuild

    • Configureer de taak om meerdere agents parallel te gebruiken. In het voorbeeld hier worden drie agents gebruikt.

      ParallelTestJobBuild

      Tip

      Voor massaal parallelle tests kunt u zo veel als 99 agents opgeven.

    • Voeg een buildartefacten-taak downloaden toe aan de taak. Deze stap is de koppeling tussen de buildtaak en de testtaak en is nodig om ervoor te zorgen dat de binaire bestanden die zijn gegenereerd in de build-taak beschikbaar zijn op de agents die door de testtaak worden gebruikt om tests uit te voeren. Zorg ervoor dat de taak is ingesteld om artefacten te downloaden die zijn geproduceerd door de huidige build en dat de artefactnaam hetzelfde is als de artefactnaam die wordt gebruikt in de taak BuildArtefacten publiceren in de build-taak.

      DownloadBuildArtifacts

    • Voeg de Visual Studio Test-taak toe en configureer deze om de vereiste segmenteringsstrategie te gebruiken.

Taken instellen voor parallelle tests in YAML-pijplijnen

Geef de parallel strategie op in de job en geef aan hoeveel taken moeten worden verzonden. U kunt maximaal 99 agents opgeven om tests voor grote testsuites omhoog te schalen.

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

Zie YAML-schema - Taak voor meer informatie.

Tests parallel uitvoeren in klassieke release-pijplijnen

Gebruik de volgende stappen als u een groot testpakket of langlopende functionele tests hebt om uit te voeren na het implementeren van uw toepassing. U kunt bijvoorbeeld een webtoepassing implementeren en Selenium-tests uitvoeren in een browser om de app-functionaliteit te valideren.

Notitie

Als u de mogelijkheid voor meerdere agents wilt gebruiken in releasepijplijnen met een on-premises TFS-server, moet u TFS 2017 Update 1 of een latere versie gebruiken.

  1. Implementeer een app met één agent. Gebruik de Azure-implementatie: resourcegroep maken of bijwerken of de taak Azure-app Service Implementeren om een web-app te implementeren in Azure-app services. Hiervoor worden de standaardtaakinstellingen (één agent, geen parallelle taken) gebruikt.

    DeployApp1Agent

  2. Voer tests parallel uit met behulp van meerdere agents:

    • Een agenttaak toevoegen

      AddAgentJobRM

    • Configureer de taak om meerdere agents parallel te gebruiken. In het voorbeeld hier worden drie agents gebruikt.

      ParallelTestJobRM

      Tip

      Voor massaal parallelle tests kunt u zo veel als 99 agents opgeven.

    • Voeg eventuele extra taken toe die moeten worden uitgevoerd voordat de Visual Studio-testtaak wordt uitgevoerd. Voer bijvoorbeeld een PowerShell-script uit om gegevens in te stellen die vereist zijn voor uw tests.

      Tip

      Taken in release-pijplijnen downloaden standaard alle artefacten die zijn gekoppeld aan de release-pijplijn. Als u tijd wilt besparen, kunt u de taak zo configureren dat alleen de testartefacten die door de taak zijn vereist, worden gedownload. Binaire web-app-bestanden zijn bijvoorbeeld niet vereist om Selenium-tests uit te voeren en deze te downloaden, kunnen worden overgeslagen als de app en testartefacten afzonderlijk worden gepubliceerd door uw build-pijplijn.

    • Voeg de Visual Studio Test-taak toe en configureer deze om de vereiste segmenteringsstrategie te gebruiken.

      Tip

      Als visual Studio niet is geïnstalleerd op de testcomputers, kunt u de taak Visual Studio Test Platform Installer gebruiken om de vereiste versie van het testplatform te verkrijgen.

Zeer parallelle tests door parallelle pijplijntaken te combineren met parallelle testuitvoering

Wanneer parallelle taken in een pijplijn worden gebruikt, worden meerdere machines (agents) gebruikt om elke taak parallel uit te voeren. Testframeworks en hardlopers bieden ook de mogelijkheid om tests parallel uit te voeren op één computer, meestal door meerdere processen of threads te maken die parallel worden uitgevoerd. Parallellismefuncties kunnen op een gelaagde manier worden gecombineerd om massaal parallelle tests uit te voeren. In de context van de Visual Studio Test-taak kan parallellisme op de volgende manieren worden gecombineerd:

  1. Parallellisme aangeboden door testframeworks. Alle moderne testframeworks, zoals MSTest v2, NUnit, xUnit en andere, bieden de mogelijkheid om tests parallel uit te voeren. Tests in een assembly worden doorgaans parallel uitgevoerd. Deze testframeworks-interface met het Visual Studio Test-platform met behulp van een testadapter en het testframework, samen met de bijbehorende adapter, en werken binnen een testhostproces dat het Visual Studio Test Platform maakt wanneer tests worden uitgevoerd. Parallellisatie op deze laag bevindt zich daarom binnen een proces voor alle frameworks en adapters.

  2. Parallellisme dat wordt aangeboden door het Visual Studio Test Platform (vstest.console.exe). Visual Studio Test Platform kan parallel testassembly's uitvoeren. Gebruikers van vstest.console.exe herkennen dit als de /parallelle switch. Dit doet u door een testhostproces op elke beschikbare kern te starten en deze te geven in een assembly die moet worden uitgevoerd. Dit werkt voor elk framework met een testadapter voor het Visual Studio-testplatform, omdat de parallellisatie-eenheid een testassembly of testbestand is. Dit, in combinatie met de parallelle uitvoering die wordt aangeboden door testframeworks (hierboven beschreven), biedt de maximale mate van parallelle uitvoering wanneer tests worden uitgevoerd op één agent in de pijplijn.

  3. Parallellisme dat wordt aangeboden door de Visual Studio Test-taak (VSTest). De VSTest-taak ondersteunt het parallel uitvoeren van tests op meerdere agents (of computers). Testsegmenten worden gemaakt en elke agent voert één segment tegelijk uit. De drie verschillende segmenteringsstrategieën, in combinatie met de parallelle uitvoering die wordt aangeboden door het testplatform en testframework (zoals hierboven beschreven), resulteren in het volgende:

    • Segmentering op basis van het aantal tests en agents. Eenvoudige segmentering waarbij tests worden gegroepeerd in segmenten van gelijke grootte. Een segment bevat tests van een of meer assembly's. Testuitvoering op de agent voldoet vervolgens aan de parallelle uitvoering die in 1 en 2 hierboven wordt beschreven.

    • Segmentering op basis van eerdere uitvoeringstijd. Op basis van de vorige tijdsinstellingen voor het uitvoeren van tests en het aantal beschikbare agents worden tests gegroepeerd in segmenten, zodat voor elk segment ongeveer gelijke uitvoeringstijd is vereist. Een segment bevat tests van een of meer assembly's. Testuitvoering op de agent voldoet vervolgens aan de parallelle uitvoering die in 1 en 2 hierboven wordt beschreven.

    • Segmentering op basis van assembly's. Een segment is een testassembly en bevat dus tests die allemaal deel uitmaken van dezelfde assembly. Uitvoering op de agent voldoet vervolgens aan de parallelle uitvoering die in 1 en 2 hierboven wordt beschreven. 2 kan echter niet optreden als een agent slechts één assembly ontvangt die moet worden uitgevoerd.

Help en ondersteuning