Показаны сообщения с ярлыком testing. Показать все сообщения
Показаны сообщения с ярлыком testing. Показать все сообщения

пятница, 26 мая 2023 г.

GitLab CI не выполняет after_script при таймауте

На днях столкнулся с очень старой проблемой (открыта 6 лет назад) в GitLab CI когда after_script не выполняется если джоба отвалилась по таймауту. В моём случае в after_script реализован сбор логов эфемерного окружения для end-to-end теста. Ирония в том что при успешном прохождении теста эти логи, как правило, никто не смотрит. А вот если тест упал, то начинают разбираться, а логов нету...

Первой мыслью было внедрить контроль времени в сам сценарий тестирования, но это не всегда бывает удобно или возможно. Например при нехватке ресурсов в кластере значительно возрастает время ожидания установки чартов и считать время придется придётся после каждой команды которая потенциально может стать "долгой".

Второй мыслью был timeout из coreutils:

$ timeout --kill-after=350s 300s ./test.sh

В принципе эта утилита не должна оставлять "осиротевших" процессов, но если запуск происходит вне контейнера, то дополнительно можно добавить systemd-run:

$ timeout --kill-after=350s 300s systemd-run --user --pty --same-dir --wait --collect ./test.sh

На следующей неделе попробую внедрить в один из проектов и посмотреть.

воскресенье, 15 ноября 2015 г.

Selenium Grid - строим ботнеты

Продолжаю "мутировать" в тестировщика. Настроил JMeter + Webdriver, но столкнулся с тем, что производительности моего Latitude e6430 не хватает для запуска больше 5 тестов одновременно. Выход - запускать тесты на нескольких машинах одновременно. Для этого мне понадобится Selenium Grid.

Схематично работу Selenium Grid с JMeter можно представить этой схемой


Для теста запустил на своем ноутбуке и компьютере коллеги ноды selenium сервера и выполнил тест. В итоге разница между запуском четырех тестов на одном компьютере отличаются от запуска четырех тестов на двух компьютерах (по два теста на компьютер) на 100 мс в пользу распределенного запуска.

Для ограничения количества тестов на одну машину выбрал формулу NCORES+1. Соответственно с двух компьютеров удалось выжать 12 одновременных тестов (при условии, что компьютеры простаивают).

Для запуска теста в headless режиме я использую Xvfb, x11vnc и минималистичные WM вроде openbox или dwm. Причем x11vnc в этой схеме сугубо опционален и нужен скорее для отладки.

пятница, 13 ноября 2015 г.

Открыл для себя связку Apache JMeter и Webdriver

По долгу службы в мои обязанности входит генерация технических статей для нашего корпоративного блога. В преддверии выхода Magento 2 мы решили протестировать ее производительность в сравнении с Magento 1. В Magento 2 встроен Full Page Cache, который очень интенсивно использует AJAX запросы для загрузки динамических блоков, которые впоследствии вклеиваются в страницу. Я уже использовал JMeter для тестирования сайтов, где не используется AJAX, но для Magento 2 этот подход не годится.

При установке Apache JMeter 2.13 и плагина Webdriver 1.3.1 столкнулся с особенностью установки. Дело в том, что плагин содержит в себе более свежие версии httpmime, httpclient и httpcore.

% tar -tf ~/downloads/apache-jmeter-2.13.tgz | grep lib/http 
apache-jmeter-2.13/lib/httpclient-4.2.6.jar
apache-jmeter-2.13/lib/httpcore-4.2.5.jar
apache-jmeter-2.13/lib/httpmime-4.2.6.jar

% unzip -l ~/downloads/JMeterPlugins-WebDriver-1.3.1.zip | grep lib/http
    40692  2015-10-12 10:08   lib/httpmime-4.5.jar
   727567  2015-10-12 10:08   lib/httpclient-4.5.jar
   322234  2015-10-12 10:08   lib/httpcore-4.4.1.jar

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

К сожалению подобная связка не подходит для нагрузочного тестирования - уже запуск 5 потоков теста ощутимо нагружает мой ноутбук с core i5, на котором запускается тест. Есть еще Selenium Grid, который вроде как решает эту проблему, но без webdriver мне удавалось создавать параллельную нагрузку на сервер в 40-50 одновременных пользователей.