Параллельное выполнение тестов для любого средства выполнения тестов

Azure DevOps Services | Azure DevOps Server 2022 г. - Azure DevOps Server 2019 г.

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

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

Предварительные требования

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

Настройка параллельных заданий

Укажите стратегию parallel в YAML и укажите, сколько заданий должно быть отправлено. Переменные System.JobPositionInPhase и System.TotalJobsInPhase добавляются в каждое задание.

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

Совет

Вы можете указать до 99 агентов для масштабирования тестирования для больших наборов тестов.

Срез набора тестов

Для параллельного выполнения тестов необходимо сначала срезать (или секционировать) набор тестов, чтобы каждый срез можно было выполнять независимо. Например, вместо выполнения большого набора из 1000 тестов на одном агенте можно использовать два агента и параллельно выполнять 500 тестов на каждом агенте. Кроме того, можно еще больше сократить время, затраченное на выполнение тестов, с помощью 8 агентов и параллельного выполнения 125 тестов на каждом агенте.

Шаг, на котором выполняются тесты в задании, должен знать, какой срез теста должен быть запущен. Для этой цели можно использовать переменные System.JobPositionInPhase и System.TotalJobsInPhase :

  • System.TotalJobsInPhase указывает общее количество срезов (это можно представить как "totalSlices")
  • System.JobPositionInPhase идентифицирует определенный срез (его можно представить как "sliceNum")

Если представить все тестовые файлы в виде одномерного массива, каждое задание может запустить тестовый файл, индексируемый в [sliceNum + totalSlices], пока не будут запущены все тестовые файлы. Например, если у вас шесть тестовых файлов и два параллельных задания, первое задание (slice0) будет запускать тестовые файлы с нумерованными номерами 0, 2 и 4, а второе задание (slice1) — тестовые файлы с нумерованными 1, 3 и 5.

6 тестов в 2 срезах

Если вместо этого вы используете три параллельных задания, первое задание (slice0) будет запускать тестовые файлы с номерами 0 и 3, второе задание (slice1) — тестовые файлы с номерами 1 и 4, а третье задание (slice2) — тестовые файлы с нумерованными 2 и 5.

6 тестов в 3 срезах

Образец кода

В этом примере .NET Core используются --list-tests параметры и --filter для dotnet test среза тестов. Тесты выполняются с помощью NUnit. Затем результаты теста, созданные тестовой DotNetCoreCLI@2 задачей, публикуются на сервере. Импортируйте (в Azure Repos или Azure DevOps Server) или вилку (в GitHub) из этого репозитория:

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

В этом примере Python используется скрипт PowerShell для среза тестов. Тесты выполняются с помощью pytest. Затем результаты тестов в стиле JUnit, созданные pytest, публикуются на сервере. Импортируйте (в Azure Repos или Azure DevOps Server) или вилку (в GitHub) из этого репозитория:

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

В этом примере JavaScript используется скрипт bash для среза тестов. Тесты выполняются с помощью средства выполнения mocha. Затем результаты тестов в стиле JUnit, созданные mocha, публикуются на сервере. Импортируйте (в Azure Repos или Azure DevOps Server) или вилку (в GitHub) из этого репозитория:

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

Пример кода содержит файл azure-pipelines.yml в корне репозитория, который можно использовать для создания конвейера. Следуйте всем инструкциям в разделе Создание первого конвейера , чтобы создать конвейер, и просмотрите тестовые срезы в действии.

Объединение параллелизма для массового параллельного тестирования

Если в конвейере используются параллельные задания, конвейер использует несколько компьютеров для параллельного выполнения каждого задания. Большинство средств выполнения тестов предоставляют возможность параллельного выполнения тестов на одном компьютере (обычно путем создания нескольких процессов или потоков, которые выполняются параллельно). Два типа параллелизма можно объединить для массового параллельного тестирования, что делает тестирование в конвейерах чрезвычайно эффективным.

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