Ранее на этом ресурсе я выкладывал свой скрипт для параллельного запуска тестов robot framework. С тех пор в команде “робота” была сделана собственная утилита распараллеливания + я поделюсь опытом использования плагина Jenkins для организации задач тестирования.
Описание задачи.
У меня тесты одного из продуктов разбиты на 2 большие группы: frontend и backend
К группе backend (я их называю availability) относятся тесты api, баз данных, rabbitmq, tomcat, настройки, и пр.
К группе frontend (я их называю sanity) относятся тесты web-морды - это selenium тесты.
Результаты тестов данных групп интересуют независимых людей, им неинтересно отвлекаться на чужие ошибки.
Меня же интересует общая картина по продукту - агрегированный отчёт backend+frontend
Сделаем следующее:
- Создадим в jenkins две задачи (job) соответствующие двум группам тестов
- Создадим в jenkins задачу, которая будет запускать параллельно предыдущие две + аггрегировать их результаты в один отчёт
- Распараллелим одну (или каждую) из групп тестов средствами robotframework
Решение.
- Я не буду подробно описывать создание задачи на запуск тестов, т.к. об этом тут говорилось много раз. Лишь уточню, что делается это при помощи “Execute batch command”, а результаты отображаются через “robotframework plugin”.
- Одна из сильных сторон Jenkins заключается в гибком управлении задачами, позволяя решать совершенно безумные вещи. Нам необходимо запустить параллельно 2 задачи, дождаться их выполнения, а потом выполнить команду по агрегации результатов в один отчёт.
Воспользуемся для этого плагином “Multijob”.
Создадим задачу, соответствующую multijob-проекту, в котором в multijob phase добавим две наши задачи. В данной фазе задачи будут выполняться параллельно.
После данной фазы добавим execute batch command, где при помощи rebot соберем результаты тестов в один отчёт.
В разделе “Послесборочные операции” также, как и ранее используем плагин “robotframework plugin” - Если надо больше “параллелизма”.
Возьмём одну из наших задач: “pqag-check_release_stand_backend” и исправим скрипт запуска так, чтобы test suite в ней выполнялись параллельно.
Для этого воспользуемся утилитой pabot. Она запускает каждый test suite параллельно в отдельном python-процессе. Количество параллельных процессов регламентируется параметром--processes
; по умолчанию он равен количеству ядер + один управляющий. По сути pabot запускает каждый test suite через pybot и соберёт их результаты через rebot. Да, в “роботе” все утилиты звучат одинаково, поэтому в нашей команде запуска нам надо заменить одну букву: pybot исправить на pabot.
pabot --suite check_availability --name Check_availability --loglevel INFO --outputdir %WORKSPACE%\output\release_stand\availability --output availability_output.xml --log availability_log.html --report availability_report.html --exclude develop --reportbackground white:white:white --monitorwidth 150 --reporttitle "Availability tests" --noncritical noncritical --randomize suites --removekeywords FOR --removekeywords WUKS %WORKSPACE%\test\release_stand\test & exit 0
Итог.
- В нашем распоряжении есть 2 степени свободы для распараллеливания тестов: Jenkins Multijob и Robot Framework pabot.
- В общей сложности мне удалось уменьшить время запуска общей задачи примерно на 60%. Тем не менее уточню, что эта цифра не абсолютна, а специфична для конкретных тестов и окружения.
- Необходимо внимательно отнестись к параметру --processes. Не стоит думать, что выставляя 100, вы получите ускорение в 100 раз.
- pabot успешно работает с параллельным запуском selenium-тестов с использованием IE (в Jenkins).