Tests parallel uitvoeren voor elke testloper

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

Het uitvoeren van tests om wijzigingen in code te valideren is essentieel voor het handhaven van de kwaliteit. Voor een succesvolle continue integratie is het essentieel dat u een goed testpakket hebt dat bij elke build wordt uitgevoerd. Naarmate de codebasis groeit, groeit de regressietestsuite echter ook 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 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 geboden. In dit artikel wordt beschreven hoe u tests parallel kunt uitvoeren door meerdere agents te gebruiken om taken te verwerken.

Vereiste

Maak uzelf vertrouwd met de concepten van agents en taken. Elke agent kan slechts één taak tegelijk uitvoeren. Als u meerdere taken parallel wilt uitvoeren, moet u meerdere agents configureren. U hebt ook voldoende parallelle taken nodig.

Parallelle taken instellen

Geef een 'parallelle' strategie op in de YAML en geef aan hoeveel taken er moeten worden verzonden. De variabelen System.JobPositionInPhase en System.TotalJobsInPhase worden aan elke taak toegevoegd.

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

Tip

U kunt maximaal 99 agents opgeven om tests voor grote testsuites op te schalen.

De testsuite segmenteren

Als u tests parallel wilt uitvoeren, moet u eerst de testsuite segmenteren (of partitioneren), zodat elk segment onafhankelijk kan worden uitgevoerd. In plaats van bijvoorbeeld een grote suite van 1000 tests uit te voeren op één agent, kunt u twee agents gebruiken en 500 tests parallel uitvoeren op elke agent. Of u kunt de hoeveelheid tijd die nodig is om de tests uit te voeren nog verder verminderen door 8 agents te gebruiken en 125 tests parallel op elke agent uit te voeren.

De stap waarmee de tests in een taak worden uitgevoerd, moet weten welk testsegment moet worden uitgevoerd. De variabelen System.JobPositionInPhase en System.TotalJobsInPhase kunnen voor dit doel worden gebruikt:

  • System.TotalJobsInPhase geeft het totale aantal segmenten aan (u kunt dit zien als 'totalSlices')
  • System.JobPositionInPhase identificeert een bepaald segment (u kunt dit zien als 'sliceNum')

Als u alle testbestanden weergeeft als een eendimensionale matrix, kan elke taak een testbestand uitvoeren dat is geïndexeerd op [sliceNum + totalSlices], totdat alle testbestanden worden uitgevoerd. Als u bijvoorbeeld zes testbestanden en twee parallelle taken hebt, voert de eerste taak (slice0) testbestanden met de nummers 0, 2 en 4 uit en worden testbestanden met de nummers 1, 3 en 5 uitgevoerd op de tweede taak (slice1).

6 tests in 2 segmenten

Als u in plaats daarvan drie parallelle taken gebruikt, voert de eerste taak (slice0) testbestanden uit met de nummers 0 en 3, voert de tweede taak (slice1) testbestanden uit met de nummers 1 en 4 en voert de derde taak (slice2) testbestanden uit met de nummers 2 en 5.

6 tests in 3 segmenten

Voorbeeldcode

In dit .NET Core-voorbeeld worden en --list-tests--filter parameters van dotnet test gebruikt om de tests te segmenteren. De tests worden uitgevoerd met behulp van NUnit. Testresultaten die door DotNetCoreCLI@2 de testtaak zijn gemaakt, worden vervolgens gepubliceerd naar de server. Importeer (in Azure-opslagplaatsen of Azure DevOps Server) of fork (in GitHub) deze opslagplaats:

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

In dit Python-voorbeeld wordt een PowerShell-script gebruikt om de tests te segmenteren. De tests worden uitgevoerd met behulp van pytest. Testresultaten in JUnit-stijl die door pytest zijn gemaakt, worden vervolgens gepubliceerd naar de server. Importeer (in Azure-opslagplaatsen of Azure DevOps Server) of fork (in GitHub) deze opslagplaats:

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

In dit JavaScript-voorbeeld wordt een bash-script gebruikt om de tests te segmenteren. De tests worden uitgevoerd met behulp van de mokkaloper. Testresultaten in JUnit-stijl die door mocha zijn gemaakt, worden vervolgens gepubliceerd naar de server. Importeer (in Azure-opslagplaatsen of Azure DevOps Server) of fork (in GitHub) deze opslagplaats:

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

De voorbeeldcode bevat een bestand azure-pipelines.yml in de hoofdmap van de opslagplaats dat u kunt gebruiken om een pijplijn te maken. Volg alle instructies in Uw eerste pijplijn maken om een pijplijn te maken en testsegmenting in actie te zien.

Parallellisme combineren voor massaal parallel testen

Wanneer parallelle taken in een pijplijn worden gebruikt, maakt de pijplijn gebruik van meerdere machines om elke taak parallel uit te voeren. De meeste testlopers bieden de mogelijkheid om tests parallel uit te voeren op één computer (meestal door meerdere processen of threads te maken die parallel worden uitgevoerd). De twee typen parallellisme kunnen worden gecombineerd voor massaal parallelle tests, waardoor testen in pijplijnen uiterst efficiënt is.

Help en ondersteuning