Köra tester parallellt med hjälp av Visual Studio-testuppgiften

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 göras enkelt genom att använda den ytterligare kapacitet som erbjuds av molnet. I den här artikeln beskrivs hur du kan konfigurera Visual Studio-testuppgiften så att den körs parallellt med hjälp av flera agenter.

Förutsättningar

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

Testslicering

Visual Studio-testaktiviteten (version 2) är utformad för att fungera sömlöst med parallella jobbinställningar. När ett pipelinejobb som innehåller Visual Studio-testaktiviteten (kallas "VSTest-uppgift" för enkelhetens skull) är konfigurerat att köras på flera agenter parallellt, identifierar det automatiskt att flera agenter är inblandade och skapar testsektorer som kan köras parallellt mellan dessa agenter.

Uppgiften kan konfigureras för att skapa testsektorer som passar olika krav, till exempel batchbearbetning baserat på antalet tester och agenter, tidigare testkörningstider eller platsen för tester i sammansättningar.

Batchbearbetningsalternativ

De här alternativen beskrivs i följande avsnitt.

Enkel segmentering baserat på antalet tester och agenter

Den här inställningen använder en enkel segmenteringsalgoritm för att dela upp antalet test "T" mellan N-agenter så att varje agent kör T/N-tester. Om testpaketet till exempel innehåller 1 000 tester och du använder två agenter för parallella jobb, kommer varje agent att köra 500 tester. Eller så kan du minska den tid det tar att köra testerna ytterligare med hjälp av åtta agenter, vilket innebär att varje agent kör 125 tester parallellt.

Det här alternativet används vanligtvis när alla tester har liknande körningstider. Om testkörningstiderna inte liknar varandra kanske agenterna inte används effektivt eftersom vissa agenter kan ta emot sektorer med flera långvariga tester, medan andra agenter kan ta emot sektorer med kortvariga tester och avslutas mycket tidigare än resten av agenterna.

Segmentering baserat på tidigare körningstid för tester

Den här inställningen tar hänsyn till tidigare körningstider för att skapa testsektorer så att varje sektor har ungefär samma körningstid. Närkörningstester batchas tillsammans, medan långvariga tester allokeras till separata sektorer.

Det här alternativet bör användas när tester inom en sammansättning inte har beroenden och inte behöver köras på samma agent. Det här alternativet resulterar i den mest effektiva användningen av agenter eftersom varje agent får samma mängd "arbete" och alla slutförs ungefär samtidigt.

Segmentering baserat på testsammansättningar

Den här inställningen använder en enkel segmenteringsalgoritm som delar upp antalet testsammansättningar (eller filer) "A" mellan N-agenter, så att varje agent kör tester från A/N-sammansättningar. Antalet tester i en sammansättning beaktas inte när du använder det här alternativet. Om testpaketet till exempel innehåller tio testsammansättningar och du använder två agenter för parallella jobb, får varje agent fem testsammansättningar som ska köras. Du kan minska den tid det tar att köra testerna ytterligare med hjälp av fem agenter, vilket innebär att varje agent får två testsammansättningar att köra.

Det här alternativet bör användas när tester inom en sammansättning har beroenden eller använder AssemblyInitialize och AssemblyCleanup, eller ClassInitialize och ClassCleanup metoder, för att hantera tillstånd i testkoden.

Köra tester parallellt i klassiska byggpipelines

Om du har en stor testsvit eller långvariga integreringstester som ska köras i den klassiska bygg-pipelinen använder du följande steg.

Kommentar

Om du vill använda multiagentfunktionen i byggpipelines med lokal TFS-server måste du använda TFS 2018 Update 2 eller en senare version.

  1. Skapa jobb med en enda agent. Skapa Visual Studio-projekt och publicera byggartefakter med hjälp av de uppgifter som visas i följande bild. Detta använder standardinställningarna för jobb (enskild agent, inga parallella jobb).

    buildJobSingleAgent

  2. Köra tester parallellt med flera agenter:

    • Lägga till ett agentjobb

      AddAgentJobBuild

    • Konfigurera jobbet så att det använder flera agenter parallellt. Exemplet här använder tre agenter.

      ParallelTestJobBuild

      Dricks

      För massivt parallell testning kan du ange så många som 99 agenter.

    • Lägg till uppgiften Hämta byggartefakter i jobbet. Det här steget är länken mellan byggjobbet och testjobbet och är nödvändigt för att säkerställa att binärfilerna som genereras i byggjobbet är tillgängliga på de agenter som används av testjobbet för att köra tester. Kontrollera att uppgiften är inställd på att ladda ned artefakter som skapats av "Aktuell version" och artefaktnamnet är detsamma som artefaktnamnet som användes i aktiviteten Publicera byggartefakter i byggjobbet.

      DownloadBuildArtifacts

    • Lägg till Visual Studio-testaktiviteten och konfigurera den så att den använder den nödvändiga segmenteringsstrategin.

Konfigurera jobb för parallell testning i YAML-pipelines

parallel Ange strategin i job och ange hur många jobb som ska skickas. Du kan ange så många som 99 agenter för att skala upp testningen för stora testpaket.

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

Mer information finns i YAML-schema – Jobb.

Köra tester parallellt i klassiska versionspipelines

Använd följande steg om du har en stor testsvit eller tidskrävande funktionella tester som ska köras efter att programmet har distribuerats. Du kanske till exempel vill distribuera ett webbprogram och köra Selenium-tester i en webbläsare för att verifiera appfunktionen.

Kommentar

Om du vill använda multiagentfunktionen i versionspipelines med lokal TFS-server måste du använda TFS 2017 Update 1 eller en senare version.

  1. Distribuera en app med en enda agent. Använd azure-distributionen: Skapa eller uppdatera resursgruppen eller Azure App Service Deploy-uppgiften för att distribuera en webbapp till Azure App Services. Detta använder standardinställningarna för jobb (enskild agent, inga parallella jobb).

    DeployApp1Agent

  2. Köra tester parallellt med flera agenter:

    • Lägga till ett agentjobb

      AddAgentJobRM

    • Konfigurera jobbet så att det använder flera agenter parallellt. Exemplet här använder tre agenter.

      ParallelTestJobRM

      Dricks

      För massivt parallell testning kan du ange så många som 99 agenter.

    • Lägg till ytterligare aktiviteter som måste köras innan Visual Studio-testaktiviteten körs. Kör till exempel ett PowerShell-skript för att konfigurera data som krävs av dina tester.

      Dricks

      Jobb i versionspipelines laddar ned alla artefakter som är länkade till versionspipelinen som standard. För att spara tid kan du konfigurera jobbet så att det bara hämtar de testartefakter som krävs av jobbet. Till exempel krävs inte binärfiler för webbappar för att köra Selenium-tester och nedladdningen av dessa kan hoppas över om appen och testartefakterna publiceras separat av bygg-pipelinen.

    • Lägg till Visual Studio-testaktiviteten och konfigurera den så att den använder den nödvändiga segmenteringsstrategin.

      Dricks

      Om testdatorerna inte har Visual Studio installerat kan du använda installationsprogrammet för Visual Studio Test Platform för att hämta den version av testplattformen som krävs.

Massivt parallell testning genom att kombinera parallella pipelinejobb med parallell testkörning

När parallella jobb används i en pipeline används flera datorer (agenter) för att köra varje jobb parallellt. Testramverk och löpare ger också möjlighet att köra tester parallellt på en enda dator, vanligtvis genom att skapa flera processer eller trådar som körs parallellt. Parallellitetsfunktioner kan kombineras på ett skiktat sätt för att uppnå massivt parallell testning. I samband med Visual Studio-testuppgiften kan parallellitet kombineras på följande sätt:

  1. Parallellitet som erbjuds av testramverk. Alla moderna testramverk som MSTest v2, NUnit, xUnit och andra ger möjlighet att köra tester parallellt. Vanligtvis körs tester i en sammansättning parallellt. Dessa testramverksgränssnitt med Visual Studio-testplattformen med hjälp av ett testkort och testramverket, tillsammans med motsvarande adapter, och fungerar inom en testvärdprocess som Visual Studio Test Platform skapar när tester körs. Därför är parallellisering på det här lagret inom en process för alla ramverk och kort.

  2. Parallellitet som erbjuds av Visual Studio Test Platform (vstest.console.exe). Visual Studio Test Platform kan köra testsammansättningar parallellt. Användare av vstest.console.exe känner igen detta som /parallel switch. Det gör det genom att starta en testvärdprocess på varje tillgänglig kärna och ge den tester i en sammansättning som ska köras. Detta fungerar för alla ramverk som har ett testkort för Visual Studio-testplattformen eftersom parallelliseringsenheten är en testsammansättning eller testfil. Detta i kombination med den parallellitet som erbjuds av testramverk (beskrivs ovan) ger maximal grad av parallellisering när tester körs på en enda agent i pipelinen.

  3. Parallellitet som erbjuds av uppgiften Visual Studio Test (VSTest). VSTest-uppgiften stöder parallellkörning av tester mellan flera agenter (eller datorer). Testsektorer skapas och varje agent kör en sektor i taget. De tre olika segmenteringsstrategierna, i kombination med den parallellitet som erbjuds av testplattformen och testramverket (enligt beskrivningen ovan), resulterar i följande:

    • Segmentering baserat på antalet tester och agenter. Enkel segmentering där tester grupperas i lika stora sektorer. Ett segment innehåller tester från en eller flera sammansättningar. Testkörningen på agenten överensstämmer sedan med den parallellitet som beskrivs i 1 och 2 ovan.

    • Segmentering baserat på tidigare körningstid. Baserat på tidigare tidpunkter för att köra tester och antalet tillgängliga agenter grupperas testerna i sektorer så att varje sektor kräver ungefär lika mycket körningstid. Ett segment innehåller tester från en eller flera sammansättningar. Testkörningen på agenten överensstämmer sedan med den parallellitet som beskrivs i 1 och 2 ovan.

    • Segmentering baserat på sammansättningar. En sektor är en testsammansättning och innehåller därför tester som alla tillhör samma sammansättning. Körningen på agenten överensstämmer sedan med den parallellitet som beskrivs i 1 och 2 ovan. 2 kan dock inte inträffa om en agent bara tar emot en sammansättning som ska köras.

Hjälp och support