Нагрузочное тестирование Atlassian Jira, Confluence, Bitbucket Часть 2

Вот здесь можно почитать часть 1 этой статьи.

В части 2 мы поговорим о том, как подготовить данные для нагрузочного тестирования с помощью инструмента dc-app-performance-toolkit.

Готовим тестовые данные

Есть два способа подготовки тестовых данных:

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

Бэкапы Atlassian

Atlassian предоставляет бэкапы для Jira, Confluence и Bitbucket, которые могут быть использованы для нагрузочного тестирования.

Для того, чтобы установить эти бэкапы, нужно перейти в папку app-dc-performance-toolkit/app/util/jira, если Вы тестируете Jira, app-dc-performance-toolkit/app/util/confluence, если Вы тестируете Confluence или app-dc-performance-toolkit/app/util/bitbucket, если Вы тестируете Bitbucket.

В этих папках содержатся файлы, которые нужно запустить, чтобы установить бэкапы Atlassian. Вот описания этих файлов:

  • index-sync.sh (только для Jira и Confluence) – этот скрипт ищет в файле atlassian-jira.log (atlassian-confluence.log) такие фразы как “indexes – 100%”. Это позволяет проверить, что индексирование завершилось. После того, как Вы установили бэкап, необходимо запустить индексирование Jira/Confluence. И в случае, если Вы устанавливаете бэкапы автоматически, а затем автоматически запускаете индексирование, этот скрипт, Вам поможет определить, что индексирование закончилось, и Вы можете запустить нагрузочные тесты.
  • populate_db.sh – этот скрипт скачивает Postgres дамп с данными и создает базу данных Jira/Confluence/Bitbucket.
  • upload_attachments.sh – этот скрипт скачивает атачи и копирует эти атачи в директорию data.
  • index-snapshot.sh (только для Confluence) – этот скрипт проверяет, что генерация снапшота индекса завершилась.

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

Хорошо, а что же делать если Вы не хотите использовать Postgres? Ведь populate_db.sh работает только для базы данных Postgres.

В этом случае только для Jira Вы можете скачать xml бэкап и восстановить его с помощью стандартной функциональности Jira. Вот ссылка на этот бэкап

https://centaurus-datasets.s3.amazonaws.com/jira/${Jira_Verson}/large/xml_backup.zip – поддерживаемые версии Jira 8.0.3, 7.13.6, 8.5.0.

Для Confluence и Bitbucket Atlassian не подготовил xml бэкапы. Вам нужно пользоваться скриптом populate_db.sh или же подготовить данные самостоятельно, о чем я расскажу далее в разделе “Используем наши собственные данные”.

Используем наши собственные данные

Если вы хотите протестировать Ваш экземпляр на Ваших собственных данных, то это тоже возможно. Все что Вам нужно, это сделать так, чтобы Ваши данные смогли быть использованы инструментом dc-app-performance-toolkit.

Когда dc-app-performance-toolkit начинает тестирование, то Taurus запускает скрипт prepare-data.py , которые выбирает из Вашего экземпляра данные, на которых будет проводится тестирование. В результате создается несколько csv файлов с данными из Вашего экземпляра.

Если prepare-data.py не сможет выбрать необходимые данные, то тестирование завершится с ошибкой. Поэтому Вам нужно сделать так, чтобы необходимые данные были в Вашем экземпляре.

Чтобы понять какие данные должны быть, нужно изучить файл prepare-data.py для того продукта, который Вы собираетесь протестировать.

Давайте изучим эти файлы.

Jira

Файл prepare-data.py для Jira находится в папке dc-app-performance-toolkit/blob/master/app/util/data_preparation/jira/.

Этот скрипт выбирает данные из Jira и создает следующие файлы:

  • issues.csv – список ишью.
  • jqls.csv – список запросов jql.
  • kanban-boards.scv – список панелей канбан.
  • project-keys.csv – список ключей проектов.
  • scrum-boards.csv- список панелей скрам.
  • users.scv – список пользвателей.

Мы не будем изучть файл prepare-data.py полностью, нам достаточно посмотреть вот на этот метод:

def __create_data_set(jira_api):
    dataset = dict()
    dataset[USERS] = __get_users(jira_api)
    software_project_keys = __get_software_project_keys(jira_api, PROJECTS_COUNT_LIMIT)
    dataset[PROJECT_KEYS] = software_project_keys
    dataset[ISSUES] = __get_issues(jira_api, software_project_keys)
    dataset[SCRUM_BOARDS] = __get_boards(jira_api, 'scrum')
    dataset[KANBAN_BOARDS] = __get_boards(jira_api, 'kanban')
    dataset[JQLS] = __generate_jqls(count=150)

    return dataset

Как Вы видите в этом методе выбираются все данные, которые понадобятся во время тестирования:

dataset[USERS] = __get_users(jira_api)

Мы выбираем пользователей из нашего экземпляра Jira. Имя пользователей должно начинаться с “performance_”. Мы должны выбрать столько пользователей, сколько одновременно работающих пользователей мы задали в параметре concurrency в файле jira.yml. Если ни одного такого пользователя не найдено или их количество недостаточно, то пользователи будут созданы. Пользователи будут иметь префикс “performance_” и пароль password.

software_project_keys = __get_software_project_keys(jira_api, PROJECTS_COUNT_LIMIT)
dataset[PROJECT_KEYS] = software_project_keys

Мы вибираем ключи проектов типа Software.

__get_issues(jira_api, software_project_keys)

Мы выбираем не более 8000 ишью из Software проектов, которые не находятся в статусе Closed.

dataset[SCRUM_BOARDS] = __get_boards(jira_api, 'scrum')

Мы выбираем не более 250 панелей скрам.

dataset[KANBAN_BOARDS] = __get_boards(jira_api, 'kanban')

Мы выбираем не более 250 панелей канбан.

dataset[JQLS] = __generate_jqls(count=150)

Мы генерируем jql запросы примерно такого содержания: ‘text ~ “abc*”‘.

Таким образом, для того, чтобы тесты запустились без ошибок, Вам нужно обеспечить наличие проектов Software c ишью и доски скрам и канбан. Если в Вашем экземпляре эти объекты уже есть, то Вам ничего делать не нужно (тестирование пройдет успешно без каких-либо изменений), если нет, то Вам нужно создать недостающие объекты.

Так как мой экземпляр Jira пуст, то я создал проекты Scrum Software Development и Kanban Software Development и снова запустил нагрузочное тестирование:

bzt jira.yml

На этот раз скрипт завершился без ошибок. Вот вывод скрипта:

18:15:24 INFO: Taurus CLI Tool v1.14.0
18:15:24 INFO: Starting with configs: ['jira.yml']
18:15:24 INFO: Configuring...
18:15:24 INFO: Artifacts dir: /Users/alexm/PycharmProjects/easymigration/dc-app-performance-toolkit/app/results/jira/2020-05-02_18-15-24
18:15:24 INFO: Preparing...
18:15:25 INFO: Starting shell command: python util/environment_checker.py
18:15:25 INFO: Starting shell command: python util/data_preparation/jira/prepare-data.py
18:15:26 WARNING: There is newer version of Taurus 1.14.2 available, consider upgrading. What's new: http://gettaurus.org/docs/Changelog/
18:15:28 INFO: Will install JMeter into /Users/alexm/.bzt/jmeter-taurus/5.2.1
18:15:28 INFO: Downloading: https://apache-mirror.rbc.ru/pub/apache//jmeter/binaries/apache-jmeter-5.2.1.zip
100% [===========================================================] Time: 0:00:04
18:15:33 INFO: Unzipping /var/folders/4r/w8hkd4w51x787tw4ynb29v2w0000gn/T/tmp9g5rzqs1.zip to /Users/alexm/.bzt/jmeter-taurus/5.2.1
18:15:50 INFO: Downloading jmeter-plugins-manager-1.3.jar from https://search.maven.org/remotecontent?filepath=kg/apc/jmeter-plugins-manager/1.3/jmeter-plugins-manager-1.3.jar
18:15:51 INFO: Downloading cmdrunner-2.2.jar from https://search.maven.org/remotecontent?filepath=kg/apc/cmdrunner/2.2/cmdrunner-2.2.jar
100% [===========================================================] Time: 0:00:01
18:15:52 INFO: Installing JMeter plugins: jpgc-casutg,jpgc-dummy,jpgc-ffw,jpgc-fifo,jpgc-functions,jpgc-json,jpgc-perfmon,jpgc-prmctl,jpgc-tst,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
18:16:38 INFO: 1 obsolete CookieManagers are found and fixed
18:16:56 INFO: Installing ChromeDriver...
18:16:56 INFO: Will install ChromeDriver into /Users/alexm/.bzt/selenium-taurus/tools/chromedriver/80.0.3987.106
18:16:56 INFO: Downloading: https://chromedriver.storage.googleapis.com/80.0.3987.106/chromedriver_mac64.zip
100% [===========================================================] Time: 0:00:01
18:16:57 INFO: Unzipping /var/folders/4r/w8hkd4w51x787tw4ynb29v2w0000gn/T/tmpurpp_7tz.zip to /Users/alexm/.bzt/selenium-taurus/tools/chromedriver/80.0.3987.106
18:16:57 INFO: Installing GeckoDriver...
18:16:57 INFO: Will install GeckoDriver into /Users/alexm/.bzt/selenium-taurus/tools/geckodriver/0.23.0
18:16:57 INFO: Downloading: https://github.com/mozilla/geckodriver/releases/download/v0.23.0/geckodriver-v0.23.0-macos.tar.gz
100% [===========================================================] Time: 0:00:02
18:17:00 INFO: Untaring /var/folders/4r/w8hkd4w51x787tw4ynb29v2w0000gn/T/tmpiurqzzt4.zip to /Users/alexm/.bzt/selenium-taurus/tools/geckodriver/0.23.0
18:17:00 WARNING: You are using Python 3, make sure that your scripts are able to run in Python 3
18:17:00 INFO: Starting...
18:17:00 INFO: Waiting for results...
18:17:00 INFO: Waiting for finish...
18:17:00 ERROR: Console screen failure: ord() expected string of length 1, but int found
18:25:22 WARNING: Please wait for graceful shutdown...
18:25:22 INFO: Shutting down...
18:25:22 INFO: Starting shell command: python util/jmeter_post_check.py
18:25:22 INFO: Starting shell command: python util/jtl_convertor/jtls-to-csv.py kpi.jtl selenium.jtl
18:25:59 INFO: Post-processing...
18:25:59 INFO: Test duration: 0:08:22
18:25:59 INFO: Samples count: 3272, 0.06% failures
18:25:59 INFO: Average times: total 0.595, latency 0.000, connect 0.000
18:25:59 INFO: Percentiles:
┌───────────────┬───────────────┐
│ Percentile, % │ Resp. Time, s │
└───────────────┴───────────────┘
18:25:59 INFO: Request label stats:
┌───────────────────────────────────────┬────────┬─────────┬────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ label                                 │ status │    succ │ avg_rt │ error                                                                                                                                           │
├───────────────────────────────────────┼────────┼─────────┼────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ jmeter_browse_boards                  │   OK   │ 100.00% │  0.186 │                                                                                                                                                 │
│ jmeter_browse_projects                │   OK   │ 100.00% │  0.149 │                                                                                                                                                 │
│ jmeter_create_issue                   │   OK   │ 100.00% │  0.135 │                                                                                                                                                 │
│ jmeter_login_and_view_dashboard       │   OK   │ 100.00% │  0.497 │                                                                                                                                                 │
│ jmeter_open_comment                   │   OK   │ 100.00% │  0.210 │                                                                                                                                                 │
│ jmeter_open_editor                    │   OK   │ 100.00% │  0.287 │                                                                                                                                                 │
│ jmeter_open_quick_create              │   OK   │ 100.00% │  0.063 │                                                                                                                                                 │
│ jmeter_save_comment                   │   OK   │ 100.00% │  0.521 │                                                                                                                                                 │
│ jmeter_save_edit                      │   OK   │ 100.00% │  0.900 │                                                                                                                                                 │
│ jmeter_search_jql                     │   OK   │ 100.00% │  0.610 │                                                                                                                                                 │
│ jmeter_view_backlog                   │   OK   │ 100.00% │  0.387 │                                                                                                                                                 │
│ jmeter_view_dashboard                 │   OK   │ 100.00% │  0.267 │                                                                                                                                                 │
│ jmeter_view_issue                     │   OK   │ 100.00% │  0.593 │                                                                                                                                                 │
│ jmeter_view_kanban_board              │   OK   │ 100.00% │  0.344 │                                                                                                                                                 │
│ jmeter_view_project_summary           │   OK   │ 100.00% │  0.611 │                                                                                                                                                 │
│ jmeter_view_scrum_board               │   OK   │ 100.00% │  0.347 │                                                                                                                                                 │
│ selenium_a_login                      │   OK   │ 100.00% │ 28.460 │                                                                                                                                                 │
│ selenium_browse_boards_list           │   OK   │ 100.00% │  9.871 │                                                                                                                                                 │
│ selenium_browse_projects_list         │   OK   │ 100.00% │  6.376 │                                                                                                                                                 │
│ selenium_create_issue                 │   OK   │ 100.00% │  5.143 │                                                                                                                                                 │
│ selenium_edit_issue                   │   OK   │ 100.00% │ 16.305 │                                                                                                                                                 │
│ selenium_save_comment                 │   OK   │ 100.00% │ 19.909 │                                                                                                                                                 │
│ selenium_search_jql                   │   OK   │ 100.00% │ 32.249 │                                                                                                                                  │
│ selenium_view_backlog_for_scrum_board │   OK   │ 100.00% │ 14.223 │                                                                                                                                                 │
│ selenium_view_dashboard               │   OK   │ 100.00% │ 13.805 │                                                                                                                                                 │
│ selenium_view_issue                   │   OK   │ 100.00% │ 12.332 │                                                                                                                                                 │
│ selenium_view_kanban_board            │   OK   │ 100.00% │ 14.675 │                                                                                                                                                 │
│ selenium_view_project_summary         │   OK   │ 100.00% │ 12.710 │                                                                                                                                                 │
│ selenium_view_scrum_board             │   OK   │ 100.00% │ 14.893 │                                                                                                                                                 │
│ selenium_z_log_out                    │   OK   │ 100.00% │ 14.889 │                                                                                                                                                 │
└───────────────────────────────────────┴────────┴─────────┴────────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
18:26:00 INFO: Writing JUnit XML report into: /Users/alexm/PycharmProjects/easymigration/dc-app-performance-toolkit/app/results/jira/2020-05-02_18-15-24/xunit.xml
18:26:00 INFO: Starting shell command: python util/analytics.py jira
18:26:06 INFO: Starting shell command: python util/cleanup_results_dir.py
18:26:06 INFO: Artifacts dir: /Users/alexm/PycharmProjects/easymigration/dc-app-performance-toolkit/app/results/jira/2020-05-02_18-15-24
18:26:06 INFO: Done performing with code: 0

Из вывода скрипта видно, что Taurus запустил файл prepare-data.py и создал следующие csv файлы:

issues.csv

KAN-1,10023,KAN
KAN-2,10024,KAN
KAN-3,10025,KAN
KAN-4,10026,KAN
KAN-5,10027,KAN
...........

jqls.csv

text ~ "vqz*" order by key
text ~ "fpl*" order by key
text ~ "zjs*" order by key
text ~ "wph*" order by key
text ~ "xhx*" order by key
text ~ "pxt*" order by key
text ~ "deh*" order by key
text ~ "iri*" order by key
text ~ "jbr*" order by key
text ~ "snt*" order by key
...........

kanban-boards.csv

2

project_keys.csv

KAN
SCRUM

scrum-boards.csv

1

users.csv

performance_kqgdayqwfj,password
performance_zyqnwihaxr,password
performance_onfxfovior,password
performance_rrujzwrxlt,password
performance_agjbcxxeqy,password

Затем Taurus установил JMeter и Chrome web driver, запустил тесты и вывел результат.

Теперь давайте посмотрим на файл prepare-data.py для Confluence и Bitbucket.

Confluence

Рассмотрим файл prepare-data.py для Confluence.

Вот основной метод:

def __create_data_set(rest_client, rpc_client):
    dataset = dict()
    dataset[USERS] = __get_users(rest_client, rpc_client, CONFLUENCE_SETTINGS.concurrency)
    dataset[PAGES] = __get_pages(rest_client, 5000)
    dataset[BLOGS] = __get_blogs(rest_client, 5000)
    return dataset
 dataset[USERS] = __get_users(rest_client, rpc_client, CONFLUENCE_SETTINGS.concurrency)

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

dataset[PAGES] = __get_pages(rest_client, 5000)

Мы вибираем страницы из Confluence по следующему cql: “type=page and title !~ JMeter and title !~ Selenium and title !~ Home”.

dataset[BLOGS] = __get_blogs(rest_client, 5000)

Мы выбираем блоги из Confluence по следующему cql: “type=blogpost and title !~ Performance”.

Таким образом, для того, чтобы запустить тестирование для Confluence Вам необходимо иметь в Вашем экземпляре страницы и блоги.

Bitbucket

Теперь посмотрим на файл prepare-data.py для Bitbucket.

Вот основная функция:

def __create_data_set(bitbucket_api):
    dataset = dict()
    dataset[USERS] = __get_users(bitbucket_api)
    dataset[PROJECTS] = __get_projects(bitbucket_api)
    dataset[REPOS] = __get_repos(bitbucket_api)
    dataset[PULL_REQUESTS] = __get_prs(bitbucket_api)
    return dataset
dataset[USERS] = __get_users(bitbucket_api)

Мы выбираем или создаем пользователей по той же логике, что и для Jira, но на этот раз у пользователей должен быть префикс “dcapt-perf-user”. И при создании пользователя пароль равен имени пользователя.

dataset[PROJECTS] = __get_projects(bitbucket_api)

Мы выбираем проекты.

dataset[REPOS] = __get_repos(bitbucket_api)

Мы выбираем репозитории.

dataset[PULL_REQUESTS] = __get_prs(bitbucket_api)

Мы выбираем пул реквесты. Количество пул реквестов должно быть не меньше, чем параметр concurrency в файле bitbucket.yml.

Таким образом, для того, чтобы запустить тесты для Bitbucket, Вам необходимо, чтобы в Вашем экземпляре были проекты, репозитории и пул рекветсы в количестве не меньше, чем параметр concurrency в файле bitbucket.yml.

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

Leave a Reply

%d bloggers like this: