Eseguire test in parallelo per qualsiasi test runner

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 cresce, il gruppo di test di regressione tende a crescere e l'esecuzione di un test di regressione completo può richiedere molto tempo. In alcuni casi, è possibile che i test stessi siano a esecuzione prolungata, in genere se 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 parallelizzare i test usando più agenti per elaborare i processi.

Prerequisito.

Acquisire familiarità con i concetti di agenti e processi. Ogni agente può eseguire un solo processo alla volta. Per eseguire più processi in parallelo, è necessario configurare più agenti. Sono necessari anche processi paralleli sufficienti.

Configurazione di processi paralleli

Specificare la strategia "parallela" in YAML e indicare il numero di processi da inviare. Le variabili System.JobPositionInPhase e System.TotalJobsInPhase vengono aggiunte a ogni processo.

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

Suggerimento

È possibile specificare fino a 99 agenti per aumentare le prestazioni dei test per gruppi di test di grandi dimensioni.

Sezionamento del gruppo di test

Per eseguire test in parallelo, è necessario prima sezione (o partizione) del gruppo di test in modo che ogni sezione possa essere eseguita in modo indipendente. Ad esempio, anziché eseguire un gruppo di grandi dimensioni di 1000 test in un singolo agente, è possibile usare due agenti ed eseguire 500 test in parallelo in ogni agente. In alternativa, è possibile ridurre la quantità di tempo impiegato per eseguire ulteriormente i test usando 8 agenti ed eseguendo 125 test in parallelo in ogni agente.

Il passaggio che esegue i test in un processo deve sapere quale sezione di test deve essere eseguita. Le variabili System.JobPositionInPhase e System.TotalJobsInPhase possono essere usate a questo scopo:

  • System.TotalJobsInPhase indica il numero totale di sezioni (è possibile considerare questo valore come "totalSlices")
  • System.JobPositionInPhase identifica una sezione specifica (può essere considerata come "sliceNum")

Se si rappresentano tutti i file di test come matrice unidimensionale, ogni processo può eseguire un file di test indicizzato in [sliceNum + totalSlices], fino a quando non vengono eseguiti tutti i file di test. Ad esempio, se sono presenti sei file di test e due processi paralleli, il primo processo (slice0) eseguirà i file di test numerati 0, 2 e 4 e il secondo processo (slice1) eseguirà i file di test numerati 1, 3 e 5.

6 test in 2 sezioni

Se invece si usano tre processi paralleli, il primo processo (slice0) eseguirà i file di test numerati 0 e 3, il secondo processo (slice1) eseguirà i file di test numerati 1 e 4 e il terzo processo (slice2) eseguirà i file di test numerati 2 e 5.

6 test in 3 sezioni

Codice di esempio

Questo esempio di .NET Core usa --list-tests i parametri e --filter di dotnet test per sezionare i test. I test vengono eseguiti usando NUnit. I risultati dei test creati dall'attività DotNetCoreCLI@2 di test vengono quindi pubblicati nel server. Importare (in Azure Repos o Azure DevOps Server) o fork (in GitHub) questo repository:

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

Questo esempio python usa uno script di PowerShell per sezionare i test. I test vengono eseguiti usando pytest. I risultati dei test in stile JUnit creati da pytest vengono quindi pubblicati nel server. Importare (in Azure Repos o Azure DevOps Server) o fork (in GitHub) questo repository:

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

Questo esempio JavaScript usa uno script bash per filtrare i test. I test vengono eseguiti usando il mocha runner. I risultati dei test in stile JUnit creati da mocha vengono quindi pubblicati nel server. Importare (in Azure Repos o Azure DevOps Server) o fork (in GitHub) questo repository:

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

Il codice di esempio include un file azure-pipelines.yml nella radice del repository che è possibile usare per creare una pipeline. Seguire tutte le istruzioni in Creare la prima pipeline per creare una pipeline e visualizzare il sezionamento dei test in azione.

Combinare il parallelismo per test paralleli massicce

Quando i processi paralleli vengono usati in una pipeline, la pipeline usa più computer per eseguire ogni processo in parallelo. La maggior parte dei test runner offre la possibilità di eseguire test in parallelo in un singolo computer (in genere creando più processi o thread eseguiti in parallelo). I due tipi di parallelismo possono essere combinati per test paralleli massicce, che rendono i test nelle pipeline estremamente efficienti.

Guida e supporto