Ejecución de pruebas en paralelo para cualquier ejecutor de pruebas

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

La ejecución de pruebas para validar los cambios en el código es un aspecto clave para mantener la calidad. Para que la práctica de integración continua sea correcta, es fundamental contar con un buen conjunto de pruebas que se ejecute con cada compilación. Sin embargo, a medida que crece el código base, el conjunto de pruebas de regresión tiende a crecer también y ejecutar una prueba de regresión total puede tardar mucho tiempo. A veces, las pruebas en sí pueden ser de larga duración, lo cual suele ser el caso si escribe pruebas de un extremo a otro. Esto reduce la velocidad con la que se puede ofrecer valor al cliente, ya que las canalizaciones no pueden procesar las compilaciones lo suficientemente rápido.

La ejecución de pruebas en paralelo es una excelente manera de mejorar la eficacia de las canalizaciones de CI/CD. Este proceso resulta fácil si se emplea la capacidad adicional que ofrece la nube. En este artículo se describe cómo se pueden ejecutar pruebas en paralelo mediante el uso de varios agentes para procesar trabajos.

Requisito previo

Familiarícese con los conceptos de agentes y trabajos. Cada agente solo puede ejecutar un trabajo a la vez. Para ejecutar varios trabajos en paralelo, debe configurar varios agentes. También necesita suficientes trabajos paralelos.

Configuración de trabajos paralelos

Especifique la estrategia "paralela" en YAML e indique cuántos trabajos deben realizarse. Las variables System.JobPositionInPhase y System.TotalJobsInPhase se agregan a cada trabajo.

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

Sugerencia

Puede especificar hasta 99 agentes para escalar verticalmente las pruebas para grandes conjuntos de pruebas.

Segmentación del conjunto de pruebas

Para ejecutar pruebas en paralelo, primero debe segmentar (o particionar) el conjunto de pruebas de forma que cada segmento pueda ejecutarse de forma independiente. Por ejemplo, en lugar de ejecutar un conjunto grande de 1000 pruebas en un solo agente, puede usar dos agentes y ejecutar 500 pruebas en paralelo en cada agente. También puede reducir aún más la cantidad de tiempo necesario para ejecutar las pruebas si usa 8 agentes y ejecuta 125 pruebas en paralelo en cada agente.

El paso de ejecución de las pruebas en un trabajo debe tener la información sobre qué segmento de prueba debe ejecutarse. Se pueden usar las variables System.JobPositionInPhase y System.TotalJobsInPhase para este fin:

  • System.TotalJobsInPhase indica el número total de segmentos (puede considerarlo como "totalSlices")
  • System.JobPositionInPhase identifica un segmento determinado (puede considerarlo como "sliceNum")

Si representa todos los archivos de prueba como una matriz unidimensional, cada trabajo puede ejecutar un archivo de prueba indexado en [sliceNum + totalSlices], hasta que se ejecuten todos los archivos de prueba. Por ejemplo, si tiene seis archivos de prueba y dos trabajos paralelos, el primer trabajo (slice0) ejecutará los archivos de prueba con los números 0, 2 y 4 y el segundo trabajo (slice1) ejecutará los archivos de prueba con los números 1, 3 y 5.

6 pruebas en 2 segmentos

En cambio, si usa tres trabajos paralelos, el primer trabajo (slice0) ejecutará los archivos de prueba con los números 0 y 3, el segundo (slice1) ejecutará los archivos de prueba con los números 1 y 4 y el tercero (slice2) ejecutará los archivos de prueba con los números 2 y 5.

6 pruebas en 3 segmentos

Código de ejemplo

En este ejemplo de .NET Core se usan los parámetros --list-tests y --filter de dotnet test para segmentar las pruebas. Las pruebas se ejecutan con NUnit. A continuación, los resultados de pruebas que crea la tarea de prueba DotNetCoreCLI@2 se publican en el servidor. Importe (en Azure Repos o Azure DevOps Server) o bifurque (en GitHub) este repositorio:

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

En este ejemplo de Python se usa un script de PowerShell para segmentar las pruebas. Las pruebas se ejecutan con pytest. A continuación, los resultados de pruebas de estilo JUnit que crea pytest se publican en el servidor. Importe (en Azure Repos o Azure DevOps Server) o bifurque (en GitHub) este repositorio:

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

En este ejemplo de JavaScript se usa un script de Bash para segmentar las pruebas. Las pruebas se ejecutan con el ejecutor de Mocha. A continuación, los resultados de pruebas de estilo JUnit que crea Mocha se publican en el servidor. Importe (en Azure Repos o Azure DevOps Server) o bifurque (en GitHub) este repositorio:

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

El código de ejemplo incluye un archivo azure-pipelines.yml en la raíz del repositorio que puede usar para crear una canalización. Siga todas las instrucciones de Creación de la primera canalización para crear una canalización y ver la segmentación de pruebas en acción.

Combinación de paralelismo para pruebas paralelas masivas

Cuando se usan trabajos paralelos en una canalización, la canalización emplea varias máquinas para ejecutar cada uno de los trabajos en paralelo. La mayoría de los ejecutores de pruebas proporcionan la capacidad de ejecutar pruebas en paralelo en una sola máquina (normalmente mediante la creación de varios procesos o subprocesos que se ejecutan en paralelo). Ambos tipos de paralelismo se pueden combinar para realizar pruebas paralelas masivas, lo que hace que las pruebas en las canalizaciones sean sumamente eficaces.

Ayuda y soporte técnico