Параллельное выполнение тестов с помощью задачи тестирования 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 или более поздней версии.
задание сборки с помощью одного агента. Создайте проекты Visual Studio и опубликуйте артефакты сборки с помощью задач, показанных на следующем рисунке. В этом случае используются параметры задания по умолчанию (один агент, не параллельные задания).
параллельное выполнение тестов с помощью нескольких агентов:
Добавьте задание агента
Настройте задание для использования нескольких агентов параллельно. В этом примере используются три агента.
Подсказка
Для массового параллельного тестирования можно указать до 99 агентов.
Добавьте задачу "Скачать артефакты сборки" в задание. Этот шаг — это связь между заданием сборки и тестовой работой, и необходимо убедиться, что двоичные файлы, созданные в задании сборки, доступны для агентов, используемых тестовой задачей для выполнения тестов. Убедитесь, что задача настроена для скачивания артефактов, созданных текущей сборкой, и имя артефакта совпадает с именем артефакта, используемым в задаче публикации артефактов сборки в задании сборки.
Добавьте задачу теста Visual Studio и настройте её для использования необходимой стратегии разделения .
Настройка заданий для параллельного тестирования в конвейерах YAML
Укажите стратегию parallel
в job
и укажите, сколько заданий должно быть отправлено. Чтобы увеличить масштаб тестирования для больших наборов тестов, можно назначить до 99 агентов.
jobs:
- job: ParallelTesting
strategy:
parallel: 2
Для получения дополнительной информации см. схему YAML — задание.
Параллельное выполнение тестов в классических конвейерах выпуска
Выполните следующие действия, если у вас есть большой набор тестов или длительные функциональные тесты для выполнения после развертывания приложения. Например, может потребоваться развернуть веб-приложение и запустить тесты Selenium в браузере для проверки функциональности приложения.
Примечание.
Чтобы использовать возможность нескольких агентов в конвейерах релиза с локальным сервером TFS, необходимо использовать TFS 2017 с первым обновлением или более поздней версией.
Разверните приложение с помощью одного агента. Используйте задачу "Azure Deployment: Create or Update Resource Group" или задачу "Azure App Service Deploy" для развертывания веб-приложения в службах приложений Azure. В этом случае используются параметры задания по умолчанию (один агент, не параллельные задания).
параллельное выполнение тестов с помощью нескольких агентов:
Добавьте задание агента
Настройте задание для использования нескольких агентов параллельно. В этом примере используются три агента.
Подсказка
Для массового параллельного тестирования можно указать до 99 агентов.
Добавьте все дополнительные задачи, которые должны выполняться перед выполнением тестовой задачи Visual Studio. Например, запустите скрипт PowerShell, чтобы настроить все данные, необходимые для тестов.
Подсказка
Задачи в конвейерах выпуска по умолчанию загружают все артефакты, связанные с конвейером выпуска. Чтобы сэкономить время, можно настроить задание для скачивания только тестовых артефактов, необходимых для задания. Например, исполняемые файлы веб-приложения не требуются для запуска тестов Selenium, и их можно не скачивать, если приложение и тестовые файлы публикуются отдельно вашей системой сборки.
Добавьте задачу теста Visual Studio и настройте ее для использования необходимой стратегии срезов.
Массовое параллельное тестирование путем объединения параллельных заданий конвейера с параллельным выполнением теста
Если параллельные задания используются в конвейере, он использует несколько компьютеров (агентов) для параллельного выполнения каждого задания. Платформы тестирования и средства выполнения также предоставляют возможность параллельного выполнения тестов на одном компьютере, как правило, путем создания нескольких процессов или потоков, выполняемых параллельно. Функции параллелизма можно объединить в многоуровневой форме, чтобы обеспечить массовое параллельное тестирование. В контексте задачи тестирования Visual Studio параллелизм можно использовать следующим образом:
параллелизм, предлагаемый фреймворками тестирования. Все современные платформы тестирования, такие как MSTest версии 2, NUnit, xUnit и другие, предоставляют возможность параллельного выполнения тестов. Обычно тесты в сборке выполняются параллельно. Эти тестовые фреймворки взаимодействуют с платформой тестирования Visual Studio с помощью тестового адаптера и работают в процессе хоста тестирования, создаваемом платформой тестирования Visual Studio при выполнении тестов. Таким образом, параллелизация на этом уровне находится в процессе для всех платформ и адаптеров.
параллелизм, предлагаемый платформой тестирования Visual Studio (vstest.console.exe). Платформа тестирования Visual Studio может параллельно запускать тестовые сборки. Пользователи vstest.console.exe узнают это как /параллельный переключатель. Это делается путем запуска тестового хост-процесса на каждом доступном ядре и передачи ему тестов в сборке программы для выполнения. Это работает для любой платформы, которая имеет адаптер тестирования для платформы тестирования Visual Studio, так как единица параллелизации — это тестовая сборка или тестовый файл. При сочетании с параллелизмом, предлагаемым платформами тестирования (описанными выше), обеспечивает максимальную степень параллелизации при выполнении тестов на одном агенте в конвейере.
Параллелизм, предоставляемый задачей Visual Studio Test (VSTest). Задача VSTest поддерживает параллельное выполнение тестов между несколькими агентами (или компьютерами). Тестовые срезы создаются, и каждый агент выполняет один срез за раз. Три различных стратегии срезов, при сочетании с параллелизмом, предлагаемым тестовой платформой (как описано выше), приводят к следующему:
Разделение на основе количества тестов и агентов. Простое деление, при котором тесты группируются в равных частях. Фрагмент содержит тесты из одной или нескольких сборок. Затем тестирование на агенте соответствует параллелизму, описанному в 1 и 2 выше.
Срез на основе предыдущего времени выполнения. На основе предыдущих сроков выполнения тестов и количества доступных агентов тесты группируются в срезы, чтобы каждый срез требует приблизительно равного времени выполнения. Срез содержит тесты из одной или нескольких сборок. Затем тестирование на агенте соответствует параллелизму, описанному в 1 и 2 выше.
Срез на основе сборок. Срез — это тестовая сборка, поэтому она содержит тесты, которые все принадлежат одной и той же сборке. Затем выполнение агента соответствует параллелизму, описанному в 1 и 2 выше. Однако 2 может не возникать, если агент получает только одну сборку для выполнения.
Помощь и поддержка
- См. нашу страницу по устранению неполадок
- Получите советы по Stack Overflow и получите поддержку через Сообщество разработчиков