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.
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.
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
- Vedere la pagina relativa alla risoluzione dei problemi
- Ottenere consigli su Stack Overflow e ottenere supporto tramite il Developer Community