Всем привет!

Хочу поделиться своим опытом нагрузочного тестирования Atlassian Jira, Confluence и Bitbucket c использованием инструмента Atlassian dc-app-performance-toolkit.

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

Если Вы хотите больше узнать про методологию нагрузочного тестирования в контексте продуктов Atlassian, то я про это рассказывал на Highload 2018.

Итак, перейдем к dc-app-performance-toolkit.

Этот инструмент позволяет Вам нагрузочно протестировать такие приложения Atlassian как Jira, Confluence и Bitbucket. Я узнал про этот инструмент, когда мне нужно было протестировать плагин Atlassian Jira для сертификации на Data Center, и сразу же мне этот инструмент понравился, потому что мне не пришлось тратить часы на его настройку. Все заработало из коробки.

В инструменте используется Taurus, jmeter и Selenium.

Вы можете использовать этот инструмент для следующих целей:

  • Вы разрабатываете плагины для Atlassian Marketplace. В этом случае Вы можете использовать этот инструмент для сертификации своего плагина для Data Center.
  • Вы используете Atlassian Jira, Confluence и Bitbucket для собственных нужд и дорабатываете эти продукты с помощью стандартных средств, скриптов, плагинов или же любыми другими способами, и Вы хотите понять насколько Ваша конфигурация выдержит нагрузку. В этом случае Вы тоже можете использовать данный инструмент. Причем важно отметить, что Вы можете проводить нагрузочное тестирование на Ваших собственных данных. Для этого Вам не придется что-то переделывать в инструменте. В документации к инструменту написано, что он поддерживает только определенные версии продуктов Atlassian, но если у Вас не совсем древняя версия продуктов Atlassian, то инструмент, скорее всего, будет работать без дополнительных доработок. В любом случае, в этой серии статей я расскажу как модифицировать инструмент.

Шаги, которые необходимо выполнить для тестирования Atlassian Jira, Confluence и Bitbucket, в большинстве случаев одинаковы, поэтому я буду выполнять все действия на Atlassian Jira. Если будут какие-то специфические шаги для продукта, то я про это упомяну.

Установка


Первым делом нужно взять инструмент с github:

git clone https://github.com/atlassian/dc-app-performance-toolkit.git

И перейти в созданную папку:

cd dc-app-performance-toolkit

Далее нужно установить все зависимости для использования инструмента. Вы можете прочитать, как это сделать в path_to_dc_app_performance_toolkit/README.md.

Файлы конфигурации


Перед тем, как пользоваться инструментом, пожалуйста, прочитайте документацию к этому инструменту в папке path_to_dc_app_performance_toolkit/doc.

Вот краткое описание содержимого этой папки:

  • В корне находятся 3 md файла (один для Jira, один для Confluence и один для Bitbucket). В этих файлах Вы можете найти информацию, как проводить нагрузочное тестирование с ипользованием этого инструмента для сертификации плагина на Data Center.
  • Три папки: jira, confluence и bitbucket с информацией о том, как запускать нагрузочные тесты для каждого из продуктов.


jira.yml


Перед тем, как запускать нагрузочное тестирование Вам необходимо внести изменения в файл jira.ymlconfluence.yml или bitbucket.yml, которые находятся в папке path_to_dc_app_performance_toolkit/app, в зависимости от того, какой продукт Вы собираетесь тестировать. Это файлы конфигурации Taurus. Почитать про Taurus Вы можете вот здесь.
Я дам комментарии к jira.yml. Файлы для других продуктов строятся по такому же принципу.

settings:

settings — это секция конфигурационного файла Taurus. Она содержит верхнеуровневые параметры для Taurus. Вы можете найти более подробную информацию по этой секции вот здесь.

  artifacts-dir: results/jira/%Y-%m-%d_%H-%M-%S

artifacts-dir — шаблон пути, который будет использоваться для хранения артефактов нагрузочного тестирования. Вот неполный список артефактов:

  • bzt.log – лог команды bzt. Данная команда запускает нагрузочное тестирование.
  • error_artifacts – папка для хранения скриншотов и html тестов Selenium, которые завершились с ошибками.
  • jmeter.err – лог JMeter.
  • kpi.jtl – данные тестирования JMeter.
  • pytest.out – лог исполнения Selenum тестов.
  • selenium.jtl – данные тестирования Selenium.
  • results.csv – агрегированные результаты тестирования.
  • jira.yml – jira.yml, который использовался для тестирования.


  aggregator: consolidator

aggregator — агрегатор, который будет использоваться для сбора результатов тестирования и передачи результатов в модуль отчетности. Вы можете прочитать больше про агрегаторы вот здесь.

  verbose: false

verbose — параметр для запуска Taurus в режиме дебага. В нашем случае мы выключем этот режим.

  env:

env позволяет установить переменные среды. Вы можете больше прочитать здесь.

    application_hostname: localhost   # Jira DC hostname without protocol and port e.g. test-jira.atlassian.com or localhost
    application_protocol: http      # http or https
    application_port: 2990            # 80, 443, 8080, 2990, etc
    application_postfix: /jira           # e.g. /jira in case of url like http://localhost:2990/jira
    admin_login: admin
    admin_password: admin

Параметры выше содержат информацию о Вашем экземпляре, который Вы собираетесь протестировать. Я указал параметры к экземпляру Jira, который располагается на моем компьютере. Эти параметры будут использоваться в JMeter, Selenium и скриптах.

    concurrency: 200
    test_duration: 45m

Эти параметры будут переданы в секцию execution. Я объясню значение этих параметров, когда будут говорить про эту секцию.

  WEBDRIVER_VISIBLE: false

WEBDRIVER_VISIBLE устанавливает видимость браузера Chrome во время выполнения тестов Selenium. Мы скрываем Chrome.

 JMETER_VERSION: 5.2.1

JMETER_VERSION — версия JMeter, которую мы будем использовать для тестирования.

    allow_analytics: Yes            # Параметр, который включает и выключает передачу аналитики в Atlassian. Эта аналитика поможет Atlassian понять, как используется инструмент, и поможет понять, сколько ресурсов потратить на развитие этого инструмента.

services:

services — секция конфигурационного файла Taurus. Здесь указывается информация о том, какие скрипты нужно запустить перед запуском, после и во время выполнения теста. Больше про эту секцию можно почитать здесь.

  - module: shellexec

Shell executor используется для выполнения скриптов.

    prepare:
      - python util/environment_checker.py
      - python util/data_preparation/jira/prepare-data.py
    shutdown:
      - python util/jmeter_post_check.py
      - python util/jtl_convertor/jtls-to-csv.py kpi.jtl selenium.jtl
    post-process:
      - python util/analytics.py jira
      - python util/cleanup_results_dir.py

Prepare, shutdown и post-process это этапы жизненного цикла Taurus. Вы можете почитать больше о жизненном цикле Taurus вот здесь. На каждом этапе запускаются скрипты. Вот эти скрипты:

  • util/environment_checker.py – проверяет версию Python и прекращает тест, если версия не та.
  • util/data_preparation/jira/prepare-data.py – подготавливает данные тестирования. Мы поговорим об этом скрипте подробно в следующей части.
  • util/jmeter_post_check.py – проверяет, существует ли файл kpi.jtl. Если этот файл не существует, значит что-то пошло не так во время тестирования JMeter.
  • util/jtl_convertor/jtls-to-csv.py kpi.jtl selenium.jtl – создает файл results.csv на основе файлов kpi.jtl и selenium.jtl. Файл results.csv содержит агрегированную информацию. Вы можете найти в этом файле такие метрики как: среднее время выполнения теста, медиану, 90% линию, максимальное и минимальное время выполнения теста и другие метрики.
  • util/analytics.py jira – отправляет аналитику в Atlassian. Вы можете отключить отправку в Atlassian с помощью параметра allow_analytics.
  • util/cleanup_results_dir.py – удаляет временные файлы, которые были созданы во время тестирования.


execution:

execution — секция конфигурационного файла Taurus. Содержит сценарии, которые будут выполняться при тестировании. Можно найти более подробную информацию здесь.

  - scenario: jmeter
    concurrency: ${concurrency}
    hold-for: ${test_duration}
    ramp-up: 3m

Это параметры выполнения сценария для JMeter. Вы можете найти больше информации здесь.

concurrency – число виртуальных пользователей. Этот параметр означает сколько одновременно работающих пользователей будет имитировать JMeter. В нашем случае мы имитируем 200 одновременно работающих пользователей.

ramp-up – время разгона теста. Мы будем выходить на 200 одновременно работающих пользователей постепенно. В нашем случае мы выйдем на 200 одновременно работающих пользователей за 3 минуты.

hold-for – продолжительность теста после выхода на заданное число одновременно работающих пользователей в параметре concurrency.

  - scenario: selenium
    executor: selenium
    runner: pytest
    hold-for: ${test_duration}

Параметры выполнения тестов Selenium. Вы можете найти больше информации здесь.

executor – Selenium.
runner – тесты будем проводить с помощью pytest.
hold-for – продолжительность тестирования.

scenarios:


scenarios — секция конфигурационного файла Taurus. Здесь приводится конфигурация для каждого сценария из секции execution.

  selenium:
    script: selenium_ui/jira_ui.py

script — путь к тестам Selenium.

  jmeter:
# provides path to the jmeter project file
    script: jmeter/jira.jmx
    properties:
      application_hostname: ${application_hostname}
      application_protocol: ${application_protocol}
      application_port: ${application_port}
      application_postfix: ${application_postfix}
      # Workload model
# the number of actions for an hour. 
      total_actions_per_hr: 54500
# actions and the % of execution within one hour. The sum of all parameters must equal to 100%
      perc_create_issue: 4
      perc_search_jql: 13
      perc_view_issue: 43
      perc_view_project_summary: 4
      perc_view_dashboard: 12
      perc_edit_issue: 4
      perc_add_comment: 2
      perc_browse_projects: 4
      perc_view_scrum_board: 3
      perc_view_kanban_board: 3
      perc_view_backlog: 6
      perc_browse_boards: 2
      perc_standalone_extension: 0 # By default disabled

script — путь к проекту JMeter, который будет выполнятся во время тестирования.

total_actions_per_hr число действий, которые будут выполнены за час. Одно действие — это выполнение одного теста. Тесты, которые будут запускаться можно понять из perc_ параметров.
perc_ параметры — процент выполнения каждого теста. Сумма всех perc_ параметров должна быть равна 100%.

modules:
  consolidator:
    rtimes-len: 0 # CONFSRVDEV-7631 reduce sampling
    percentiles: [] # CONFSRVDEV-7631 disable all percentiles due to Taurus's excessive memory usage


modules — секция конфигурационного файла Taurus. Эта секция содержит описание всех модулей, которые будут использоваться во время тестирования.

  jmeter:
    version: ${JMETER_VERSION}
    detect-plugins: true
    memory-xmx: 8G  # allow JMeter to use up to 8G of memory
    plugins:
      - bzm-parallel=0.4
      - bzm-random-csv=0.6
      - jpgc-casutg=2.5
      - jpgc-dummy=0.2
      - jpgc-ffw=2.0
      - jpgc-fifo=0.2
      - jpgc-functions=2.1
      - jpgc-json=2.6
      - jpgc-perfmon=2.1
      - jpgc-prmctl=0.4
      - jpgc-tst=2.4
      - jpgc-wsc=0.3
      - tilln-sshmon=1.0
      - jpgc-cmd=2.2
      - jpgc-synthesis=2.2
    system-properties:
      server.rmi.ssl.disable: true
      java.rmi.server.hostname: localhost
      httpsampler.ignore_failed_embedded_resources: "true"

jmeter — параметры JMeter модуля. Вы можете прочитать про модуль Jmeter здесь.
detect-plugins – JMeter Plugins Manager позволяет устанавливать плагины для JMeter автоматически. Мы устанавливаем этот параметр в yes, для того, чтобы Taurus сказал Jmeter, чтобы тот установил все необходимые плагины автоматически.
plugins – список плагинов JMeter, которые использовались при написании тестов.
system-properties – дополнительные параметры для JMeter.

  selenium:
# version of the chrome driver
    chromedriver:
      version: "80.0.3987.106" # Supports Chrome version 80. You can refer to http://chromedriver.chromium.org/downloads

selenium — параметры для Selenium.
chromedriver – версия драйвера Chrome, который мы будем использовать для тестирования.

reporting:
- data-source: sample-labels
  module: junit-xml

reporting — секция конфигурационного файла Taurus. Здесь устанавливаются настройки для модулей анализа и отчетности. Мы используем модуль отчетности JUnit xml. Вы можете найти больше информации по этому модулю здесь.

Давайте подведем итог.

У нас 6 секций в файле jira.xml:
settings – верхнеуровневые настройки и параметры.
Вам необходимо изменить следующие параметры в этой секции:

application_hostname: localhost   # Jira DC hostname without protocol and port e.g. test-jira.atlassian.com or localhost
    application_protocol: http      # http or https
    application_port: 2990            # 80, 443, 8080, 2990, etc
    application_postfix: /jira           # e.g. /jira in case of url like http://localhost:2990/jira
    admin_login: admin
    admin_password: admin

Так же Вам, возможно, понадобится изменить следующие параметры:

concurrency: 5
test_duration: 5m

Я изменил эти параметры на маленькие значения для того, чтобы тесты быстро отрабатывали.
Если Вы изменили test_duration и concurrency не забудьте проверить параметр ramp-up в секции execution. Возможно, Вам его тоже потребуется изменить.
services – скрипты, которые буду выполняться на этапах жизненного цикла тестов Taurus.
execution – параметры выполнения сценариев тестирования. Сначала запускаем JMeter, а потом Selenium.
scenarios – параметры сценариев тестирования. Возможно, Вам понядобится изменить количество операций в час и процентное соотношение тестов. О том как добавлять или удалять тесты я расскажу в одной из следующих частей.
modules – модули, используемые для тестов. Мы используем consolidator, JMeter и Selenium. Taurus обеспечивает нам наличие этих модулей во время тестирования.
reporting – параметры модуля отчетности.
Хорошо. Мы изменили файл конфигурации и готовы запускать тесты.

Run test


Первым делом активируйте Python virtual environment (Вы можете найти информацию об этим в файле README.md), перейдите в папку app и запустите тест:

bzt jira.yml

В моем случае тест завершился с ошибкой:

17:03:26 WARNING: Errors for python util/data_preparation/jira/prepare-data.py:
There are no software projects in Jira

Все правильно. Мое экземпляр Jira пуст. Необходимо наполнить его данными для тестирования. Я расскажу, как это сделать, в части 2.