Параллельное выполнение тестов с помощью задачи тестирования Visual Studio

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

Выполнение тестов для проверки изменений кода является ключом к поддержанию качества. Для успешной интеграции важно иметь хороший набор тестов, выполняемый с каждой сборкой. Однако по мере роста базы кода набор тестов регрессии, как правило, растет, и выполнение полного регрессии теста может занять много времени. Иногда сами тесты могут быть длительными. Обычно это происходит при написании сквозных тестов. Это снижает скорость доставки клиентской ценности, так как конвейеры не могут быстро обрабатывать сборки.

Параллельное выполнение тестов — отличный способ повысить эффективность конвейеров CI/CD. Это можно сделать легко, используя дополнительную емкость, предлагаемую облаком. В этой статье описывается, как настроить задачу тестирования Visual Studio для параллельного выполнения тестов с помощью нескольких агентов.

Необходимые условия

Ознакомьтесь с понятиями агентов и заданий. Для параллельного выполнения нескольких заданий необходимо настроить несколько агентов. Кроме того, вам потребуется достаточно параллельных заданий.

Тестирование срезов

Задача тестирования Visual Studio (версия 2) предназначена для эффективной работы с параллельными параметрами задания. Когда задание конвейера, содержащее задачу тестирования Visual Studio (которая называется задачей VSTest для простоты), настраивается для параллельного выполнения нескольких агентов, она автоматически обнаруживает, что несколько агентов участвуют и создают тестовые срезы, которые могут выполняться параллельно между этими агентами.

Задача может быть настроена для создания срезов тестов в соответствии с различными требованиями, такими как пакетная обработка на основе количества тестов и агентов, предыдущего времени выполнения теста или расположения тестов в сборках.

Параметры пакетной обработки

Эти параметры описаны в следующих разделах.

Простая срезка на основе количества тестов и агентов

Этот параметр использует простой алгоритм срезов для разделения количества тестов T между агентами N, чтобы каждый агент запускал тесты T/N. Например, если набор тестов содержит 1000 тестов, и вы используете два агента для параллельных заданий, каждый агент будет выполнять 500 тестов. Кроме того, можно сократить время, затраченное на выполнение тестов, с помощью восьми агентов, в этом случае каждый агент выполняет 125 тестов параллельно.

Этот параметр обычно используется, если все тесты имеют аналогичное время выполнения. Если время выполнения теста не совпадает, агенты могут не использоваться эффективно, так как некоторые агенты могут получать срезы с несколькими длительными тестами, а другие агенты могут получать срезы с короткими тестами и завершать гораздо раньше остальных агентов.

Срезы на основе последнего времени выполнения тестов

Этот параметр учитывает время выполнения в прошлом, чтобы создать срезы тестов, чтобы каждый срез был примерно одинаковым временем выполнения. Короткие тесты будут пакетированы вместе, в то время как длительные тесты будут выделены для отдельных срезов.

Этот параметр следует использовать, если тесты в сборке не имеют зависимостей и не должны выполняться в одном агенте. Этот параметр приводит к наиболее эффективному использованию агентов, так как каждый агент получает одинаковое количество "работ" и все завершается примерно одновременно.

Срез на основе тестовых сборок

Этот параметр использует простой алгоритм срезов, который разделяет количество тестовых сборок (или файлов) "A" между агентами N, чтобы каждый агент запускал тесты из сборок A/N. Количество тестов в сборке не учитывается при использовании этого параметра. Например, если набор тестов содержит десять тестовых сборок и используется два агента для параллельных заданий, каждый агент получит пять тестовых сборок для выполнения. Вы можете сократить время, затраченное на выполнение тестов еще дальше, используя пять агентов, в этом случае каждый агент получает две тестовые сборки для выполнения.

Этот параметр следует использовать при выполнении тестов в сборке зависимостей или использования AssemblyInitialize и AssemblyCleanup(или ClassInitialize ) ClassCleanup методов для управления состоянием в коде теста.

Параллельное выполнение тестов в классических конвейерах сборки

Если у вас есть большой набор тестов или длительные тесты интеграции для выполнения в классическом конвейере сборки, выполните следующие действия.

Примечание.

Чтобы использовать возможность нескольких агентов в конвейерах сборки с локальным сервером TFS, необходимо использовать TFS 2018 с обновлением 2 или более поздней версией.

  1. Создание задания с помощью одного агента. Создайте проекты Visual Studio и опубликуйте артефакты сборки с помощью задач, показанных на следующем рисунке. В этом случае используются параметры задания по умолчанию (один агент, не параллельные задания).

    buildJobSingleAgent

  2. Параллельное выполнение тестов с помощью нескольких агентов:

    • Добавление задания агента

      AddAgentJobBuild

    • Настройте задание для параллельного использования нескольких агентов. В этом примере используются три агента.

      ParallelTestJobBuild

      Совет

      Для массового параллельного тестирования можно указать до 99 агентов.

    • Добавьте задачу "Скачать артефакты сборки" в задание. Этот шаг — это связь между заданием сборки и тестовой работой, и необходимо убедиться, что двоичные файлы, созданные в задании сборки, доступны для агентов, используемых тестовой задачей для выполнения тестов. Убедитесь, что задача настроена для скачивания артефактов, созданных текущей сборкой, и имя артефакта совпадает с именем артефакта, используемым в задаче "Публикация артефактов сборки" в задании сборки.

      DownloadBuildArtifacts

    • Добавьте задачу тестирования Visual Studio и настройте ее для использования необходимой стратегии срезов.

Настройка заданий для параллельного тестирования в конвейерах YAML

parallel Укажите стратегию в поле job и укажите, сколько заданий должно быть отправлено. Чтобы увеличить масштаб тестирования для больших наборов тестов, можно указать до 99 агентов.

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

Дополнительные сведения см. в схеме YAML — задание.

Параллельное выполнение тестов в классических конвейерах выпуска

Выполните следующие действия, если у вас есть большой набор тестов или длительные функциональные тесты для выполнения после развертывания приложения. Например, может потребоваться развернуть веб-приложение и запустить тесты Selenium в браузере для проверки функциональности приложения.

Примечание.

Чтобы использовать возможность нескольких агентов в конвейерах выпуска с локальным сервером TFS, необходимо использовать TFS 2017 с обновлением 1 или более поздней версией.

  1. Разверните приложение с помощью одного агента. Используйте развертывание Azure: создание или обновление группы ресурсов или задачи развертывания службы приложение Azure для развертывания веб-приложения в службах приложение Azure. В этом случае используются параметры задания по умолчанию (один агент, не параллельные задания).

    DeployApp1Agent

  2. Параллельное выполнение тестов с помощью нескольких агентов:

    • Добавление задания агента

      AddAgentJobRM

    • Настройте задание для параллельного использования нескольких агентов. В этом примере используются три агента.

      ParallelTestJobRM

      Совет

      Для массового параллельного тестирования можно указать до 99 агентов.

    • Добавьте все дополнительные задачи , которые должны выполняться перед выполнением тестовой задачи Visual Studio. Например, запустите скрипт PowerShell, чтобы настроить все данные, необходимые для тестов.

      Совет

      Задания в конвейерах выпуска загружают все артефакты, связанные с конвейером выпуска по умолчанию. Чтобы сэкономить время, можно настроить задание для скачивания только тестовых артефактов, необходимых для задания. Например, двоичные файлы веб-приложения не требуются для запуска тестов Selenium и скачивания их можно пропустить, если приложение и тестовые артефакты публикуются отдельно конвейером сборки.

    • Добавьте задачу тестирования Visual Studio и настройте ее для использования необходимой стратегии срезов.

      Совет

      Если на тестовых компьютерах не установлено Visual Studio, можно использовать задачу установщика тестовой платформы Visual Studio для получения требуемой версии тестовой платформы.

Массовое параллельное тестирование путем объединения параллельных заданий конвейера с параллельным выполнением теста

Если параллельные задания используются в конвейере, он использует несколько компьютеров (агентов) для параллельного выполнения каждого задания. Платформы тестирования и средства выполнения также предоставляют возможность параллельного выполнения тестов на одном компьютере, как правило, путем создания нескольких процессов или потоков, выполняемых параллельно. Функции параллелизма можно объединить в многоуровневой форме, чтобы обеспечить массовое параллельное тестирование. В контексте задачи тестирования Visual Studio параллелизм можно объединить следующим образом:

  1. Параллелизм, предлагаемый платформами тестирования. Все современные платформы тестирования, такие как MSTest версии 2, NUnit, xUnit и другие, предоставляют возможность параллельного выполнения тестов. Обычно тесты в сборке выполняются параллельно. Эти платформы тестирования интерфейсы с платформой тестирования Visual Studio с помощью адаптера тестирования и платформы тестирования вместе с соответствующим адаптером, а также работают в процессе узла тестирования, создаваемый платформой тестирования Visual Studio при выполнении тестов. Таким образом, параллелизация на этом уровне находится в процессе для всех платформ и адаптеров.

  2. Параллелизм, предлагаемый платформой тестирования Visual Studio (vstest.console.exe). Платформа тестирования Visual Studio может параллельно запускать тестовые сборки. Пользователи vstest.console.exe распознают это как параметр /parallel. Это делается путем запуска тестового процесса узла на каждом доступном ядре и передачи его тестов в сборке для выполнения. Это работает для любой платформы, которая имеет адаптер тестирования для платформы тестирования Visual Studio, так как единица параллелизации — это тестовая сборка или тестовый файл. При сочетании с параллелизмом, предлагаемым платформами тестирования (описанными выше), обеспечивает максимальную степень параллелизации при выполнении тестов на одном агенте в конвейере.

  3. Параллелизм, предлагаемый задачей Visual Studio Test (VSTest). Задача VSTest поддерживает параллельное выполнение тестов между несколькими агентами (или компьютерами). Тестовые срезы создаются, и каждый агент выполняет один срез за раз. Три разных стратегии срезов при сочетании с параллелизмом, предлагаемым тестовой платформой и платформой тестирования (как описано выше), приводят к следующему:

    • Срез на основе количества тестов и агентов. Простая срезка, в которой тесты группируются в равных размерах. Срез содержит тесты из одной или нескольких сборок. Затем выполнение теста на агенте соответствует параллелизму, описанному в 1 и 2 выше.

    • Срез на основе предыдущего времени выполнения. На основе предыдущих сроков выполнения тестов и количества доступных агентов тесты группируются в срезы, чтобы каждый срез требует приблизительно равного времени выполнения. Срез содержит тесты из одной или нескольких сборок. Затем выполнение теста на агенте соответствует параллелизму, описанному в 1 и 2 выше.

    • Срез на основе сборок. Срез — это тестовая сборка, поэтому содержит тесты, принадлежащие одной сборке. Затем выполнение агента соответствует параллелизму, описанному в 1 и 2 выше. Однако 2 может не возникать, если агент получает только одну сборку для выполнения.

Справка и поддержка