Распараллеливание тестов (Jenkins + RobotFramework)


(Dmitriy Zverev) #1

Ранее на этом ресурсе я выкладывал свой скрипт для параллельного запуска тестов robot framework. С тех пор в команде "робота" была сделана собственная утилита распараллеливания + я поделюсь опытом использования плагина Jenkins для организации задач тестирования.

Описание задачи.

У меня тесты одного из продуктов разбиты на 2 большие группы: frontend и backend
К группе backend (я их называю availability) относятся тесты api, баз данных, rabbitmq, tomcat, настройки, и пр.
К группе frontend (я их называю sanity) относятся тесты web-морды - это selenium тесты.
Результаты тестов данных групп интересуют независимых людей, им неинтересно отвлекаться на чужие ошибки.
Меня же интересует общая картина по продукту - агрегированный отчёт backend+frontend

Сделаем следующее:

  1. Создадим в jenkins две задачи (job) соответствующие двум группам тестов
  2. Создадим в jenkins задачу, которая будет запускать параллельно предыдущие две + аггрегировать их результаты в один отчёт
  3. Распараллелим одну (или каждую) из групп тестов средствами robotframework

Решение.

  1. Я не буду подробно описывать создание задачи на запуск тестов, т.к. об этом тут говорилось много раз. Лишь уточню, что делается это при помощи "Execute batch command", а результаты отображаются через "robotframework plugin".
  2. Одна из сильных сторон Jenkins заключается в гибком управлении задачами, позволяя решать совершенно безумные вещи. Нам необходимо запустить параллельно 2 задачи, дождаться их выполнения, а потом выполнить команду по агрегации результатов в один отчёт.
    Воспользуемся для этого плагином "Multijob".
    Создадим задачу, соответствующую multijob-проекту, в котором в multijob phase добавим две наши задачи. В данной фазе задачи будут выполняться параллельно.
    После данной фазы добавим execute batch command, где при помощи rebot соберем результаты тестов в один отчёт.

    В разделе "Послесборочные операции" также, как и ранее используем плагин "robotframework plugin"
  3. Если надо больше "параллелизма".
    Возьмём одну из наших задач: "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

Итог.

  1. В нашем распоряжении есть 2 степени свободы для распараллеливания тестов: Jenkins Multijob и Robot Framework pabot.
  2. В общей сложности мне удалось уменьшить время запуска общей задачи примерно на 60%. Тем не менее уточню, что эта цифра не абсолютна, а специфична для конкретных тестов и окружения.
  3. Необходимо внимательно отнестись к параметру --processes. Не стоит думать, что выставляя 100, вы получите ускорение в 100 раз.
  4. pabot успешно работает с параллельным запуском selenium-тестов с использованием IE (в Jenkins).