Köra tester parallellt för alla testkörare

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

Att köra tester för att verifiera kodändringar är nyckeln till att upprätthålla kvaliteten. För att den kontinuerliga integreringen ska lyckas är det viktigt att du har en bra testsvit som körs med varje version. Men när kodbasen växer tenderar regressionstestsviten att växa och det kan ta lång tid att köra ett fullständigt regressionstest. Ibland kan själva testerna vara tidskrävande – detta är vanligtvis fallet om du skriver tester från slutpunkt till slutpunkt. Detta minskar hastigheten med vilken kundvärdet kan levereras eftersom pipelines inte kan bearbeta byggen tillräckligt snabbt.

Att köra tester parallellt är ett bra sätt att förbättra effektiviteten i CI/CD-pipelines. Detta kan enkelt göras genom att använda den ytterligare kapacitet som erbjuds av molnet. Den här artikeln beskriver hur du kan parallellisera tester med hjälp av flera agenter för att bearbeta jobb.

Förhandskrav

Bekanta dig med begreppen agenter och jobb. Varje agent kan bara köra ett jobb i taget. Om du vill köra flera jobb parallellt måste du konfigurera flera agenter. Du behöver också tillräckligt med parallella jobb.

Konfigurera parallella jobb

Ange en "parallell" strategi i YAML och ange hur många jobb som ska skickas. Variablerna System.JobPositionInPhase och System.TotalJobsInPhase läggs till i varje jobb.

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

Tips

Du kan ange så många som 99 agenter för att skala upp testningen för stora testpaket.

Segmentera testsviten

Om du vill köra tester parallellt måste du först segmentera (eller partitionera) testpaketet så att varje sektor kan köras oberoende av varandra. I stället för att till exempel köra en stor uppsättning med 1 000 tester på en enda agent kan du använda två agenter och köra 500 tester parallellt på varje agent. Eller så kan du minska den tid det tar att köra testerna ytterligare genom att använda 8 agenter och köra 125 tester parallellt på varje agent.

Det steg som kör testerna i ett jobb måste veta vilken testsektor som ska köras. Variablerna System.JobPositionInPhase och System.TotalJobsInPhase kan användas för detta ändamål:

  • System.TotalJobsInPhase anger det totala antalet sektorer (du kan se det som "totalSlices")
  • System.JobPositionInPhase identifierar en viss sektor (du kan se det som "sliceNum")

Om du representerar alla testfiler som en endimensionell matris kan varje jobb köra en testfil indexerad vid [sliceNum + totalSlices] tills alla testfiler körs. Om du till exempel har sex testfiler och två parallella jobb körs det första jobbet (segment0) testfilerna numrerade 0, 2 och 4, och det andra jobbet (segment1) kör testfilerna 1, 3 och 5.

6 tester i 2 sektorer

Om du använder tre parallella jobb i stället kör det första jobbet (slice0) testfilerna numrerade 0 och 3, det andra jobbet (segment1) kör testfilerna numrerade 1 och 4 och det tredje jobbet (segment2) kör testfilerna numrerade 2 och 5.

6 tester i 3 sektorer

Exempelkod

Det här .NET Core-exemplet använder --list-tests och --filter parametrar för dotnet test för att segmentera testerna. Testerna körs med NUnit. Testresultat som skapats av DotNetCoreCLI@2 testaktiviteten publiceras sedan till servern. Importera (till Azure Repos eller Azure DevOps Server) eller förgrena (till GitHub) den här lagringsplatsen:

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

Det här Python-exemplet använder ett PowerShell-skript för att segmentera testerna. Testerna körs med pytest. Testresultat i JUnit-stil som skapats av pytest publiceras sedan till servern. Importera (till Azure Repos eller Azure DevOps Server) eller förgrena (till GitHub) den här lagringsplatsen:

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

Det här JavaScript-exemplet använder ett bash-skript för att segmentera testerna. Testerna körs med hjälp av mocha-löparen. JUnit-testresultat som skapats av mocha publiceras sedan till servern. Importera (till Azure Repos eller Azure DevOps Server) eller förgrena (till GitHub) den här lagringsplatsen:

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

Exempelkoden innehåller en fil azure-pipelines.yml i roten på lagringsplatsen som du kan använda för att skapa en pipeline. Följ alla instruktioner i Skapa din första pipeline för att skapa en pipeline och se testslicering i praktiken.

Kombinera parallellitet för massivt parallell testning

När parallella jobb används i en pipeline använder pipelinen flera datorer för att köra varje jobb parallellt. De flesta testkörare har möjlighet att köra tester parallellt på en enda dator (vanligtvis genom att skapa flera processer eller trådar som körs parallellt). De två typerna av parallellitet kan kombineras för massivt parallell testning, vilket gör testning i pipelines extremt effektiv.

Hjälp och support