Delen via


Voer tests parallel uit voor elke testloper

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022 | Azure DevOps Server 2020

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 tests kunt parallelliseren met behulp van meerdere agents om taken te verwerken.

Vereiste

Raak 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 'parallelle' strategie op in de YAML en geef aan hoeveel taken moeten worden verzonden. De variabelen System.JobPositionInPhase en System.TotalJobsInPhase worden aan elke taak toegevoegd.

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

Aanbeveling

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

De testsuite segmenteren

Als u tests parallel wilt uitvoeren, moet u het testpakket eerst 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 tijd die nodig is om de tests nog verder uit te voeren verminderen door 8 agents te gebruiken en 125 tests parallel uit te voeren op elke agent.

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 hiervoor 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 beschouwen als 'sliceNum')

Als u alle testbestanden als één dimensionale matrix vertegenwoordigt, 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, worden met de eerste taak (slice0) testbestanden uitgevoerd met de nummer 0, 2 en 4 en de tweede taak (slice1) met de nummer 1, 3 en 5.

6 tests in 2 segmenten

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

6 tests in 3 segmenten

Voorbeeldcode

Dit .NET Core-voorbeeld gebruikt --list-tests en --filter parameters voor het segmenteren van dotnet test de tests. De tests worden uitgevoerd met NUnit. Testresultaten die door DotNetCoreCLI@2 de testtaak worden gemaakt, worden vervolgens naar de server gepubliceerd. 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 op 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 mocha-runner. Testresultaten in JUnit-stijl die door mocha zijn gemaakt, worden vervolgens gepubliceerd op 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 die u kunt gebruiken om een pijplijn te maken. Volg alle instructies in Uw eerste pijplijn maken om een pijplijn te maken en bekijk testsegmentering in actie.

Parallellisme combineren voor massaal parallelle tests

Wanneer parallelle taken in een pijplijn worden gebruikt, gebruikt de pijplijn meerdere computers 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 parallelle uitvoering kunnen worden gecombineerd voor massaal parallelle tests, waardoor het testen in pijplijnen zeer efficiënt is.

Help en ondersteuning