вторник, 8 июля 2014 г.

TeamCity TestRuns on Rails: распараллеливаем тест-раны и агрегируем статистику

В автоматизации тестирования часто требуется распараллелить запуск тестовых сьюитов и при этом собрать общую статистику в едином отчете по тест-рану. Можно решить эту задачу, создав собственный парсер результатов прогона каждого тест-сьюита, а можно воспользоваться механизмом зависимых конфигураций в TeamCity, о которых было написано в статье "TeamCity triggers & dependencies: построение процессов разработки и тестирования". Суть этого подхода проста: нужно добавить в TeamCity конфигурации для запуска отдельных тест-сьюитов, а также конфигурацию для основного тест-раннера, который будет запускать сьюиты и агрегировать их результаты используя механизм зависимых конфигураций.

Для наглядности объяснений создадим проект Test collecting содержащий следующие конфигурации (см. Рис. 1.):

  1. Test Suite One – конфигурация для запуска первого набора тестов.
  2. Test Suite Two – конфигурация для запуска второго набора тестов.
  3. Test Suite Three – конфигурация для запуска третьего набора тестов.
  4. Test Suite MAIN – конфигурация основного тест-раннера, который распараллеливает запуск остальных сьюитов и агрегирует их результаты.
Рис. 1. Конфигурации для тест-сьюитов и основного раннера, добавленные в проект.

Внутри конфигураций каждого тест-сьюита добавим фейковые наборы тестов, используя теги TeamCity, про которые можно узнать из статьи "Использование TeamCity в качестве системы управления запуском функциональных авто-тестов". Пусть в набор войдут как проходящие, так и фейлящиеся тесты. Для этого в каждую из конфигураций трёх тест-сьюитов нужно добавить шаги (Build step) содержащие код, аналогичный следующему (см. Рис. 2.):

Теги TeamCity для создания фейкового набора тестов внутри шагов тест-конфигураций
echo ##teamcity[testSuiteStarted name='Suite One']

echo ##teamcity[testStarted name='test_1_1']
echo ##teamcity[testFinished name='test_1_1']

echo ##teamcity[testStarted name='test_1_2']
echo ##teamcity[testFailed name='test_1_2' message='FAIL' details='Traceback']
echo ##teamcity[testFinished name='test_1_2']

echo ##teamcity[testStarted name='test_1_3']
echo ##teamcity[testFinished name='test_1_3']

echo ##teamcity[testSuiteFinished name='Suite One']

Рис. 2. Создание фейковых наборов тестов.

Для четвёртой конфигурации – основного тест-раннера – нужно добавить её зависимости (Snapshot Dependencies) от результатов первых трёх конфигураций. При этом следует выставить опцию "Run build even if dependency has failed", чтобы тест-раннер запускался и агрегировал результаты, даже если какой-либо тест в сьюитах зафейлится (см. Рис. 3.). Если требуется пробросить в тест-сьюиты значения каких-либо параметров, можно обратиться к ним через dep-переменные. Для этого в основном тест-раннере к таким параметрам нужно добавить префикс dep.: %dep.config_id.test_param%, где config_id – идентификатор конфигурации сьюита, test_param – параметр, существующий в сьюите.

Рис. 3. Настройка зависимостей для основного тест-раннера.

После того, как для основного тест-раннера будут правильно настроены зависимости, для любого тест-рана этой конфигурации на служебной вкладке Dependencies будет отображаться цепочка тест-сьюитов (Test Suite One, Two, Three), вошедших в основной сьюит (Test Suite MAIN), см. пример на Рис. 4.

Рис. 4. Цепочка тест-сьюитов, вошедшая в запуск основного тест-раннера.

Во время любого запуска тест-раннера, он также запустит все связанные с ним конфигурации тест-сьюитов, отправит их на любые доступные агенты TeamCity, дождётся окончания тестирования и затем агрегирует результаты внутри себя (см. Рис. 5.). При этом, в дополнительных настройках перед запуском тестов, можно указать, требуется или нет перезапуск каждого связанного сьюита, а также всех, от которых они зависят.

Рис. 5. Запуск конфигурации основного тест-раннера.

После того, как все сьюиты, связанные с основным, будут выполнены, в результатах основного тест-рана на служебной вкладке Overview будет автоматически агрегирована информация по всем проблемным тестам во всех сьюитах, аналогично, как это выглядит для результатов запуска каждого сьюита в отдельности (см. Рис. 6).

Рис. 6. Агрегированные результаты основного тест-рана.

Таким образом, механизм зависимых конфигураций в TeamCity можно использовать для создания тест-раннеров, позволяющих добавлять в очередь и распараллеливать запуск любого набора тестов по различным агентам, а затем агрегировать результаты их выполнения.