Eseguire test in parallelo usando l'attività Test di Visual Studio

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

L'esecuzione di test per convalidare le modifiche al codice è fondamentale per mantenere la qualità. Per garantire il successo della pratica di integrazione continua, è essenziale disporre di un gruppo di test valido che viene eseguito con ogni compilazione. Tuttavia, man mano che la codebase aumenta, il gruppo di test di regressione tende a crescere e l'esecuzione di un test di regressione completa può richiedere molto tempo. In alcuni casi, i test stessi possono essere a esecuzione prolungata. Questo è in genere il caso in cui si scrivono test end-to-end. Ciò riduce la velocità con cui il valore del cliente può essere distribuito perché le pipeline non possono elaborare le compilazioni abbastanza rapidamente.

L'esecuzione di test in parallelo è un ottimo modo per migliorare l'efficienza delle pipeline CI/CD. Questa operazione può essere eseguita facilmente usando la capacità aggiuntiva offerta dal cloud. Questo articolo illustra come configurare l'attività test di Visual Studio per eseguire i test in parallelo usando più agenti.

Prerequisiti

Acquisire familiarità con i concetti di agenti e processi. Per eseguire più processi in parallelo, è necessario configurare più agenti. Sono necessari anche processi paralleli sufficienti.

Test di sezionamento

L'attività test di Visual Studio (versione 2) è progettata per funzionare senza problemi con le impostazioni di processo parallele. Quando un processo della pipeline che contiene l'attività test di Visual Studio (definita "attività VSTest" per semplicità) è configurata per l'esecuzione su più agenti in parallelo, rileva automaticamente che sono coinvolti più agenti e crea sezioni di test che possono essere eseguite in parallelo tra questi agenti.

L'attività può essere configurata per creare sezioni di test in base a requisiti diversi, ad esempio l'invio in batch in base al numero di test e agenti, ai tempi di esecuzione dei test precedenti o alla posizione dei test negli assembly.

Opzioni di invio in batch

Queste opzioni sono illustrate nelle sezioni seguenti.

Slicing semplice in base al numero di test e agenti

Questa impostazione usa un semplice algoritmo di sezionamento per dividere il numero di test 'T' tra agenti 'N' in modo che ogni agente esegua test T/N. Ad esempio, se il gruppo di test contiene 1000 test e si usano due agenti per i processi paralleli, ogni agente eseguirà 500 test. In alternativa, è possibile ridurre la quantità di tempo impiegato per eseguire ulteriormente i test usando otto agenti, nel qual caso ogni agente esegue 125 test in parallelo.

Questa opzione viene in genere usata quando tutti i test hanno tempi di esecuzione simili. Se i tempi di esecuzione dei test non sono simili, gli agenti potrebbero non essere utilizzati in modo efficace perché alcuni agenti possono ricevere sezioni con diversi test a esecuzione prolungata, mentre altri agenti possono ricevere sezioni con test con esecuzione breve e terminare molto prima del resto degli agenti.

Sezionamento basato sul tempo di esecuzione precedente dei test

Questa impostazione considera i tempi di esecuzione precedenti per creare sezioni di test in modo che ogni sezione abbia approssimativamente lo stesso tempo di esecuzione. I test a esecuzione breve verranno raggruppati in batch, mentre i test a esecuzione prolungata verranno allocati a sezioni separate.

Questa opzione deve essere usata quando i test all'interno di un assembly non hanno dipendenze e non devono essere eseguiti nello stesso agente. Questa opzione comporta l'utilizzo più efficiente degli agenti perché ogni agente ottiene la stessa quantità di "lavoro" e tutte terminano approssimativamente contemporaneamente.

Sezionamento basato su assembly di test

Questa impostazione usa un semplice algoritmo di sezionamento che divide il numero di assembly di test (o file) 'A' tra gli agenti 'N', in modo che ogni agente esegua i test dagli assembly A/N. Il numero di test all'interno di un assembly non viene preso in considerazione quando si usa questa opzione. Ad esempio, se il gruppo di test contiene dieci assembly di test e si usano due agenti per i processi paralleli, ogni agente riceverà cinque assembly di test da eseguire. È possibile ridurre la quantità di tempo impiegato per eseguire ulteriormente i test usando cinque agenti, nel qual caso ogni agente ottiene due assembly di test da eseguire.

Questa opzione deve essere usata quando i test all'interno di un assembly hanno dipendenze o utilizzano AssemblyInitialize i metodi , AssemblyCleanupo ClassInitialize e ClassCleanup per gestire lo stato nel codice di test.

Eseguire test in parallelo nelle pipeline di compilazione classiche

Se si dispone di un gruppo di test di grandi dimensioni o di test con esecuzione prolungata per l'esecuzione nella pipeline di compilazione classica, seguire questa procedura.

Nota

Per usare la funzionalità multi-agente nelle pipeline di compilazione con il server TFS locale, è necessario usare TFS 2018 Update 2 o versione successiva.

  1. Compilare un processo usando un singolo agente. Compilare progetti di Visual Studio e pubblicare artefatti di compilazione usando le attività illustrate nell'immagine seguente. In questo modo vengono usate le impostazioni predefinite del processo (singolo agente, nessun processo parallelo).

    buildJobSingleAgent

  2. Eseguire test in parallelo usando più agenti:

    • Aggiungere un processo dell'agente

      AddAgentJobBuild

    • Configurare il processo per l'uso di più agenti in parallelo. Nell'esempio seguente vengono usati tre agenti.

      ParallelTestJobBuild

      Suggerimento

      Per i test paralleli massivi, è possibile specificare fino a 99 agenti.

    • Aggiungere un'attività Scarica artefatti di compilazione al processo. Questo passaggio è il collegamento tra il processo di compilazione e il processo di test ed è necessario per assicurarsi che i file binari generati nel processo di compilazione siano disponibili negli agenti usati dal processo di test per eseguire i test. Assicurarsi che l'attività sia impostata per scaricare gli artefatti generati da 'Compilazione corrente' e il nome dell'artefatto corrisponde al nome dell'artefatto usato nell'attività Pubblica artefatti di compilazione nel processo di compilazione.

      DownloadBuildArtifacts

    • Aggiungere l'attività Test di Visual Studio e configurarla per usare la strategia di sezionamento necessaria.

Configurazione di processi per il test parallelo nelle pipeline YAML

Specificare la parallel strategia in job e indicare il numero di processi da inviare. È possibile specificare fino a 99 agenti per aumentare le prestazioni dei test per gruppi di test di grandi dimensioni.

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

Per altre informazioni, vedere Schema YAML - Processo.

Eseguire test in parallelo nelle pipeline di versione classica

Seguire questa procedura se si dispone di un gruppo di test di grandi dimensioni o test funzionali a esecuzione prolungata da eseguire dopo la distribuzione dell'applicazione. Ad esempio, è possibile distribuire un'applicazione Web ed eseguire test Selenium in un browser per convalidare la funzionalità dell'app.

Nota

Per usare la funzionalità multi-agente nelle pipeline di versione con il server TFS locale, è necessario usare TFS 2017 Update 1 o versione successiva.

  1. Distribuire un'app usando un singolo agente. Usare l'attività Distribuzione di Azure: Creare o aggiornare un gruppo di risorse o l'attività distribuzione del servizio app Azure per distribuire un'app Web ai servizi di app Azure. In questo modo vengono usate le impostazioni predefinite del processo (singolo agente, nessun processo parallelo).

    DeployApp1Agent

  2. Eseguire test in parallelo usando più agenti:

    • Aggiungere un processo dell'agente

      AddAgentJobRM

    • Configurare il processo per l'uso di più agenti in parallelo. Nell'esempio seguente vengono usati tre agenti.

      ParallelTestJobRM

      Suggerimento

      Per i test paralleli massivi, è possibile specificare fino a 99 agenti.

    • Aggiungere eventuali attività aggiuntive che devono essere eseguite prima dell'esecuzione dell'attività di test di Visual Studio. Ad esempio, eseguire uno script di PowerShell per configurare i dati richiesti dai test.

      Suggerimento

      I processi nelle pipeline di versione scaricano tutti gli artefatti collegati alla pipeline di versione per impostazione predefinita. Per risparmiare tempo, è possibile configurare il processo per scaricare solo gli artefatti di test richiesti dal processo. Ad esempio, i file binari dell'app Web non sono necessari per eseguire test Selenium e scaricarli possono essere ignorati se l'app e gli artefatti di test vengono pubblicati separatamente dalla pipeline di compilazione.

    • Aggiungere l'attività Test di Visual Studio e configurarla per usare la strategia di sezionamento necessaria.

      Suggerimento

      Se nei computer di test non è installato Visual Studio, è possibile usare l'attività Programma di installazione della piattaforma di test di Visual Studio per acquisire la versione richiesta della piattaforma di test.

Test paralleli massivi combinando processi di pipeline paralleli con l'esecuzione di test paralleli

Quando i processi paralleli vengono usati in una pipeline, vengono usati più computer (agenti) per eseguire ogni processo in parallelo. I framework di test e gli strumenti di esecuzione offrono anche la possibilità di eseguire test in parallelo in un singolo computer, in genere creando più processi o thread eseguiti in parallelo. Le funzionalità di parallelismo possono essere combinate in modo a più livelli per ottenere test paralleli massicce. Nel contesto dell'attività Test di Visual Studio, il parallelismo può essere combinato nei modi seguenti:

  1. Parallelismo offerto dai framework di test. Tutti i framework di test moderni, ad esempio MSTest v2, NUnit, xUnit e altri, offrono la possibilità di eseguire test in parallelo. In genere, i test in un assembly vengono eseguiti in parallelo. Questi framework di test si interfacciano con la piattaforma di test di Visual Studio usando un adattatore di test e il framework di test, insieme all'adattatore corrispondente e funzionano all'interno di un processo host di test creato dalla piattaforma di test di Visual Studio quando vengono eseguiti i test. Di conseguenza, la parallelizzazione a questo livello è all'interno di un processo per tutti i framework e gli adattatori.

  2. Parallelismo offerto dalla piattaforma di test di Visual Studio (vstest.console.exe). Visual Studio Test Platform può eseguire assembly di test in parallelo. Gli utenti di vstest.console.exe lo riconosceranno come opzione /parallel. A tale scopo, avviare un processo host di test in ogni core disponibile e di consegnare i test in un assembly da eseguire. Questa operazione funziona per qualsiasi framework con un adattatore di test per la piattaforma di test di Visual Studio perché l'unità di parallelizzazione è un assembly di test o un file di test. Ciò, se combinato con il parallelismo offerto dai framework di test (descritto in precedenza), fornisce il grado massimo di parallelizzazione quando i test vengono eseguiti su un singolo agente nella pipeline.

  3. Parallelismo offerto dall'attività Test di Visual Studio (VSTest). L'attività VSTest supporta l'esecuzione di test in parallelo tra più agenti (o computer). Vengono create sezioni di test e ogni agente esegue una sezione alla volta. Le tre diverse strategie di sezionamento, combinate con il parallelismo offerto dalla piattaforma di test e dal framework di test (come descritto in precedenza), comportano quanto segue:

    • Sezionamento basato sul numero di test e agenti. Sezionamento semplice in cui i test vengono raggruppati in sezioni di dimensioni uguali. Una sezione contiene test di uno o più assembly. Testare l'esecuzione sull'agente è quindi conforme al parallelismo descritto in 1 e 2 sopra.

    • Sezionamento basato sul tempo di esecuzione precedente. In base ai tempi precedenti per l'esecuzione dei test e al numero di agenti disponibili, i test vengono raggruppati in sezioni in modo che ogni sezione richieda tempi di esecuzione approssimativamente uguali. Una sezione contiene test di uno o più assembly. Testare l'esecuzione sull'agente è quindi conforme al parallelismo descritto in 1 e 2 sopra.

    • Sezionamento basato su assembly. Una sezione è un assembly di test e quindi contiene test che appartengono tutti allo stesso assembly. L'esecuzione sull'agente è quindi conforme al parallelismo descritto in 1 e 2 sopra. Tuttavia, 2 potrebbe non verificarsi se un agente riceve un solo assembly da eseguire.

Assistenza e supporto