Ejecución de pruebas en paralelo con la tarea de prueba de Visual Studio

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. Esto puede hacerse fácilmente empleando la capacidad adicional que ofrece la nube. En este artículo se describe cómo configurar la tarea de prueba de Visual Studio para ejecutar pruebas en paralelo mediante varios agentes.

Requisito previo

Familiarícese con los conceptos de agentes y trabajos. Para ejecutar varios trabajos en paralelo, debe configurar varios agentes. También necesita suficientes trabajos paralelos.

Segmentación de pruebas

La tarea de prueba de Visual Studio (versión 2) está diseñada para funcionar de forma fluida con la configuración del trabajo paralelo. Cuando un trabajo de canalización que contiene la tarea de prueba de Visual Studio (denominada "tarea VSTest" por simplicidad) está configurado para ejecutarse en varios agentes en paralelo, detecta automáticamente que hay varios agentes implicados y crea segmentos de prueba que se pueden ejecutar en paralelo en estos agentes.

La tarea se puede configurar para crear segmentos de prueba que se adapten a diferentes requisitos, como el procesamiento por lotes en función del número de pruebas y agentes, los tiempos de ejecución de pruebas anteriores o la ubicación de las pruebas en ensamblados.

Opciones de procesamiento por lotes

Las opciones se explican en las siguientes secciones.

Segmentación simple basada en el número de pruebas y agentes

Esta configuración usa un algoritmo de segmentación simple para dividir el número de pruebas "T" entre "N" agentes para que cada agente ejecute T/N pruebas. Por ejemplo, si el conjunto de pruebas contiene 1000 pruebas y usa dos agentes para trabajos paralelos, cada agente ejecutará 500 pruebas. También puede reducir aún más el tiempo de ejecución de las pruebas utilizando ocho agentes, en cuyo caso cada agente ejecuta 125 pruebas en paralelo.

Esta opción se usa normalmente cuando todas las pruebas tienen tiempos de ejecución similares. Si los tiempos de ejecución de pruebas no son similares, es posible que los agentes no se usen de forma eficaz porque algunos agentes pueden recibir segmentos con varias pruebas de larga duración, mientras que otros agentes pueden recibir segmentos con pruebas de corta duración y finalizar mucho antes que el resto de los agentes.

Segmentación basada en el tiempo de ejecución anterior de las pruebas

Esta configuración considera los tiempos de ejecución anteriores para crear segmentos de pruebas de modo que cada segmento tenga aproximadamente el mismo tiempo de ejecución. Las pruebas de corta duración se agruparán, mientras que las pruebas de larga duración se asignarán a segmentos independientes.

Esta opción se debe usar cuando las pruebas dentro de un ensamblado no tienen dependencias y no es necesario ejecutarlas en el mismo agente. Esta opción se traduce en un uso más eficaz de los agentes porque cada agente obtiene la misma cantidad de "trabajo" y todo finaliza aproximadamente al mismo tiempo.

Segmentación basada en ensamblados de prueba

Esta configuración usa un algoritmo de segmentación simple que divide el número de ensamblados de pruebas (o archivos) "A" entre "N" agentes, de modo que cada agente ejecute pruebas de A/N ensamblados. El número de pruebas dentro de un ensamblado no se tiene en cuenta al usar esta opción. Por ejemplo, si el conjunto de pruebas contiene diez ensamblados de pruebas y usa dos agentes para trabajos paralelos, cada agente recibirá cinco ensamblados de pruebas para ejecutar. Puede reducir aún más el tiempo de ejecución de las pruebas utilizando cinco agentes, en cuyo caso cada agente recibe dos ensamblados de pruebas para ejecutar.

Esta opción se debe usar cuando las pruebas dentro de un ensamblado tienen dependencias o utilizan métodos AssemblyInitialize y AssemblyCleanup, o ClassInitialize y ClassCleanup, para administrar el estado en su código de prueba.

Ejecución de pruebas en paralelo en canalizaciones de compilación clásicas

Si tiene un gran conjunto de pruebas o pruebas de integración de larga duración para ejecutar en su canalización de compilación clásica, siga estos pasos.

Nota

Para usar la funcionalidad multiagente en canalizaciones de compilación con un servidor TFS local, debe usar la actualización 2 de TFS 2018 o una versión posterior.

  1. Compile un trabajo mediante un único agente. Compile proyectos de Visual Studio y publique artefactos de compilación mediante las tareas que se muestran en la imagen siguiente. Esto usa la configuración de trabajo predeterminada (agente único, sin trabajos paralelos).

    buildJobSingleAgent

  2. Ejecute pruebas en paralelo mediante varios agentes:

    • Agregue un trabajo de agente.

      AddAgentJobBuild

    • Configure el trabajo para que use varios agentes en paralelo. En el ejemplo siguiente se usan tres agentes.

      ParallelTestJobBuild

      Sugerencia

      Para las pruebas paralelas masivas, puede especificar hasta 99 agentes.

    • Agregue una tarea Descargar artefactos de compilación al trabajo. Este paso es el vínculo entre el trabajo de compilación y el trabajo de prueba, y es necesario para asegurarse de que los archivos binarios generados en el trabajo de compilación están disponibles en los agentes usados por el trabajo de prueba para ejecutar pruebas. Asegúrese de que la tarea está configurada para descargar artefactos generados por la "compilación actual" y el nombre del artefacto es el mismo que el nombre del artefacto usado en la tarea Publicar artefactos de compilación en el trabajo de compilación.

      DownloadBuildArtifacts

    • Agregue la tarea Prueba de Visual Studio y configúrela para usar la estrategia de segmentación necesaria.

Configuración de trabajos para pruebas paralelas en canalizaciones de YAML

Especifique la estrategia parallel en job e indique cuántos trabajos se deben enviar. Puede especificar hasta 99 agentes para escalar verticalmente las pruebas de grandes conjuntos de pruebas.

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

Para obtener más información, vea Esquema YAML: trabajo.

Ejecución de pruebas en paralelo en canalizaciones de versión clásicas

Siga estos pasos si tiene un conjunto de pruebas de gran tamaño o pruebas funcionales de larga duración para ejecutarse después de implementar la aplicación. Por ejemplo, puede que quiera implementar una aplicación web y ejecutar pruebas de Selenium en un explorador para validar la funcionalidad de la aplicación.

Nota

Para usar la funcionalidad multiagente en canalizaciones de versión con un servidor TFS local, debe usar la actualización 1 de TFS 2017 o una versión posterior.

  1. Implemente la aplicación mediante un único agente. Usar la implementación de Azure: Cree o actualice el grupo de recursos o la tarea de implementación de Azure App Service para implementar una aplicación web en Azure App Services. Esto usa la configuración de trabajo predeterminada (agente único, sin trabajos paralelos).

    DeployApp1Agent

  2. Ejecute pruebas en paralelo mediante varios agentes:

    • Agregue un trabajo de agente.

      AddAgentJobRM

    • Configure el trabajo para que use varios agentes en paralelo. En el ejemplo siguiente se usan tres agentes.

      ParallelTestJobRM

      Sugerencia

      Para las pruebas paralelas masivas, puede especificar hasta 99 agentes.

    • Agregue las tareas adicionales que se deben ejecutar antes de ejecutar la tarea de prueba de Visual Studio. Por ejemplo, ejecute un script de PowerShell para configurar los datos requeridos por las pruebas.

      Sugerencia

      Los trabajos de las canalizaciones de versión descargan todos los artefactos vinculados a la canalización de versión de forma predeterminada. Para ahorrar tiempo, puede configurar el trabajo para descargar solo los artefactos de prueba necesarios para el trabajo. Por ejemplo, los archivos binarios de la aplicación web no son necesarios para ejecutar pruebas de Selenium y su descarga se puede omitir si la aplicación y los artefactos de prueba se publican por separado mediante la canalización de compilación.

    • Agregue la tarea Prueba de Visual Studio y configúrela para usar la estrategia de segmentación necesaria.

      Sugerencia

      Si las máquinas de prueba no tienen Instalado Visual Studio, puede usar la tarea Instalador de plataforma de pruebas de Visual Studio para adquirir la versión necesaria de la plataforma de prueba.

Pruebas paralelas masivas mediante la combinación de trabajos de canalización paralelos con la ejecución de pruebas paralelas

Cuando se usan trabajos paralelos en una canalización, se emplean varias máquinas (agentes) para ejecutar cada trabajo en paralelo. Los marcos de pruebas y los ejecutores también 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. Las características del paralelismo se pueden combinar superpuestas para lograr pruebas paralelas masivas. En el contexto de la tarea de prueba de Visual Studio, el paralelismo se puede combinar de las siguientes maneras:

  1. Paralelismo ofrecido por marcos de pruebas. Todos los marcos de pruebas modernos, como MSTest v2, NUnit, xUnit y otros proporcionan la capacidad de ejecutar pruebas en paralelo. Normalmente, las pruebas de un ensamblado se ejecutan en paralelo. Estos marcos de pruebas interactúan con la plataforma de pruebas de Visual Studio mediante un adaptador de prueba y el marco de pruebas, junto con el adaptador correspondiente, y funcionan dentro de un proceso de host de prueba que crea la plataforma de pruebas de Visual Studio cuando se ejecutan las pruebas. Por lo tanto, la paralelización en esta capa se encuentra dentro de un proceso para todos los marcos y adaptadores.

  2. Paralelismo ofrecido por la plataforma de pruebas de Visual Studio (vstest.console.exe). La plataforma de pruebas de Visual Studio puede ejecutar ensamblados de prueba en paralelo. Los usuarios de vstest.console.exe reconocerán esto como el modificador /parallel. Para ello, inicia un proceso de host de prueba en cada núcleo disponible y le entrega pruebas en un ensamblado para que las ejecute. Esto funciona para cualquier marco que tenga un adaptador de prueba para la plataforma de pruebas de Visual Studio porque la unidad de paralelización es un ensamblado de prueba o un archivo de prueba. Esto, cuando se combina con el paralelismo que ofrecen los marcos de pruebas (descritos anteriormente), proporciona el grado máximo de paralelización cuando las pruebas se ejecutan en un solo agente de la canalización.

  3. Paralelismo ofrecido por la tarea de prueba de Visual Studio (VSTest). La tarea VSTest admite la ejecución de pruebas en paralelo entre varios agentes (o máquinas). Se crean segmentos de prueba y cada agente ejecuta un segmento cada vez. Las tres estrategias de segmentación diferentes, cuando se combinan con el paralelismo ofrecido por la plataforma de pruebas y el marco de pruebas (como se ha descrito anteriormente), dan como resultado lo siguiente:

    • Segmentación basada en el número de pruebas y agentes. Segmentación simple en la que las pruebas se agrupan en segmentos de tamaño igual. Un segmento contiene pruebas de uno o varios ensamblados. A continuación, la ejecución de prueba en el agente se ajusta al paralelismo descrito en los puntos 1 y 2 anteriores.

    • Segmentación basada en el tiempo de ejecución pasado. En función de los tiempos anteriores para ejecutar pruebas y el número de agentes disponibles, las pruebas se agrupan en segmentos de forma que cada segmento requiera aproximadamente el mismo tiempo de ejecución. Un segmento contiene pruebas de uno o varios ensamblados. A continuación, la ejecución de prueba en el agente se ajusta al paralelismo descrito en los puntos 1 y 2 anteriores.

    • Segmentación basada en ensamblados. Un segmento es un ensamblado de prueba y, por tanto, contiene pruebas que pertenecen al mismo ensamblado. La ejecución de prueba en el agente se ajusta al paralelismo descrito en los puntos 1 y 2 anteriores. Sin embargo, es posible que 2 no se produzca si un agente recibe solo un ensamblado para ejecutar.

Ayuda y soporte técnico