Быстрый Старт


Что такое Bencher?

Bencher - это набор инструментов для непрерывного тестирования производительности. Когда-нибудь регрессия производительности влияла на ваших пользователей? Bencher мог бы предотвратить это. Bencher позволяет вам обнаруживать и предотвращать регрессии производительности до того, как они попадут в продакшн.

  • Запустить: Запустите свои тесты производительности локально или в CI, используя ваши любимые инструменты для этого. CLI bencher просто оборачивает ваш существующий аппарат тестирования и сохраняет его результаты.
  • Отслеживать: Отслеживайте результаты ваших тестов производительности со временем. Мониторите, запрашивайте и строите графики результатов с помощью веб-консоли Bencher на основе ветки исходного кода, испытательного стенда и меры.
  • Поймать: Отлавливайте регрессии производительности в CI. Bencher использует инструменты аналитики, работающие по последнему слову техники, чтобы обнаружить регрессии производительности, прежде чем они попадут в продакшн.

По тем же причинам, по которым модульные тесты запускаются в CI, чтобы предотвратить регрессии функций, тесты производительности должны быть запущены в CI с Bencher, чтобы предотвратить регрессии производительности. Ошибки производительности – это тоже ошибки!


Установка CLI bencher

Linux, Mac и Unix

Для систем Linux, Mac и других систем, подобных Unix, выполните следующее в вашем терминале:

Terminal window
curl --proto '=https' --tlsv1.2 -sSfL https://bencher.dev/download/install-cli.sh | sh

Windows

Для систем Windows выполните следующее в терминале PowerShell:

Terminal window
irm https://bencher.dev/download/install-cli.ps1 | iex

🐰 Если вы получаете ошибку, которая говорит запуск скриптов отключен на этой системе:

  • Откройте Powershell с Запуск от имени администратора
  • Выполните: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
  • Введите: Y
  • Запустите этот скрипт заново

Для дополнительных вариантов установки смотрите как установить CLI bencher.

Теперь давайте проверим, что у нас установлен CLI bencher.

Запустите: bencher --version

Вы должны увидеть:

$ bencher --version
bencher 0.3.26

Создайте аккаунт в Bencher Cloud

Bencher - это открытое и само-хостимое программное обеспечение. Если вас интересует само-хостинг, ознакомьтесь с учебником по Docker для Bencher. Но для этого учебника мы будем использовать Bencher Cloud.

Зарегистрируйтесь в Bencher Cloud


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


Создание токена API

Чтобы использовать API Bencher, вам нужно создать токен API. Перейдите в Bencher Console. Наведите указатель мыши на свое имя в правом верхнем углу. Появится выпадающее меню. Выберите Токены. На странице Токены API нажмите кнопку ➕ Добавить.

Добавить токен API


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

На Linux, Mac и других системах типа Unix выполните: export BENCHER_API_TOKEN=YOUR_TOKEN

На Windows выполните: $env:BENCHER_API_TOKEN = "YOUR_TOKEN"

Если вы затем выполните echo $BENCHER_API_TOKEN или Write-Output $env:BENCHER_API_TOKEN соответственно.

Вы должны увидеть:

$ echo $BENCHER_API_TOKEN
YOUR_TOKEN

🐰 Примечание: Если вы перейдете в другой терминал, вам нужно будет снова экспортировать токен API.


Создайте проект

Теперь, когда у нас есть учетная запись пользователя и API токен, мы можем создать проект. Сначала нам нужно знать, к какой организации принадлежит наш новый проект.

Запустите: bencher org list

Вы должны увидеть что-то вроде:

$ bencher org list
[
{
"name": "Saul Goodman",
"slug": "saul-goodman",
"uuid": "4581feb0-6cac-40a9-bd8a-d7865183b01e"
"created": "2022-07-06T11:24:36Z",
"modified": "2022-07-06T11:24:36Z"
}
]

Ваш вывод должен немного отличаться от приведенного выше:

  • uuid является псевдослучайным
  • name и slug будут основаны на вашем имени пользователя
  • created и modified метки времени будут от того момента, когда вы только что зарегистрировались

Теперь мы можем создать новый проект внутри вашей организации. Подставьте slug вашей организации для аргумента organization (например, YOUR_ORG_SLUG) в приведенную ниже команду.

Запустите: bencher project create YOUR_ORG_SLUG --name "Save Walter White" --url http://www.savewalterwhite.com

Вы должны увидеть что-то вроде:

$ bencher project create saul-goodman --name "Save Walter White" --url http://www.savewalterwhite.com
{
"organization": "4581feb0-6cac-40a9-bd8a-d7865183b01e",
"name": "Save Walter White",
"slug": "save-walter-white-1234abcd",
"uuid": "c6c2a8e8-685e-4413-9a19-5b79053a71b1"
"url": "http://www.savewalterwhite.com",
"public": true,
"created": "2022-07-06T11:36:24Z",
"modified": "2022-07-06T11:36:24Z"
}

Снова, ваш вывод должен немного отличаться от приведенного выше. Главное, чтобы эта команда работала. Отметьте поле slug проекта (например, save-walter-white-1234abcd).


Запустите отчет

Наконец, мы готовы собрать некоторые показатели нагрузочных тестов! Для простоты в этом учебнике мы будем использовать фиктивные данные.

Запустите: bencher mock

Вы должны увидеть что-то вроде:

$ bencher mock
{
"bencher::mock_0": {
"latency": {
"value": 3.7865423396154463,
"lower_value": 3.4078881056539014,
"upper_value": 4.165196573576991
}
},
"bencher::mock_1": {
"latency": {
"value": 16.398332128878437,
"lower_value": 14.758498915990593,
"upper_value": 18.03816534176628
}
},
"bencher::mock_2": {
"latency": {
"value": 20.88091359871672,
"lower_value": 18.792822238845048,
"upper_value": 22.969004958588393
}
},
"bencher::mock_3": {
"latency": {
"value": 33.88103801203782,
"lower_value": 30.492934210834036,
"upper_value": 37.2691418132416
}
},
"bencher::mock_4": {
"latency": {
"value": 40.90515638867921,
"lower_value": 36.81464074981129,
"upper_value": 44.99567202754713
}
}
}

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


Теперь давайте запустим отчет с использованием фиктивных данных нагрузочного измерения. Подставьте slug вашего проекта для аргумента --project (то есть YOUR_PROJECT_SLUG) в команду ниже.

Запустите: bencher run --project YOUR_PROJECT_SLUG "bencher mock"

Вы должны увидеть что-то вроде:

$ bencher run save-walter-white-1234abcd "bencher mock"
{
"bencher::mock_0": {
"latency": {
"value": 0.15496641529475275,
"lower_value": 0.13946977376527747,
"upper_value": 0.17046305682422802
}
},
"bencher::mock_1": {
"latency": {
"value": 18.648298578180437,
"lower_value": 16.783468720362393,
"upper_value": 20.513128435998482
}
},
"bencher::mock_2": {
"latency": {
"value": 28.20328182167366,
"lower_value": 25.382953639506294,
"upper_value": 31.023610003841025
}
},
"bencher::mock_3": {
"latency": {
"value": 34.45732560787596,
"lower_value": 31.01159304708836,
"upper_value": 37.903058168663556
}
},
"bencher::mock_4": {
"latency": {
"value": 44.9237520767597,
"lower_value": 40.43137686908373,
"upper_value": 49.41612728443567
}
}
}
{
"branch": "master",
"end_time": "2023-07-18T14:21:27.796871Z",
"results": [
"{\n \"bencher::mock_0\": {\n \"latency\": {\n \"value\": 0.15496641529475275,\n \"lower_value\": 0.13946977376527747,\n \"upper_value\": 0.17046305682422802\n }\n },\n \"bencher::mock_1\": {\n \"latency\": {\n \"value\": 18.648298578180437,\n \"lower_value\": 16.783468720362393,\n \"upper_value\": 20.513128435998482\n }\n },\n \"bencher::mock_2\": {\n \"latency\": {\n \"value\": 28.20328182167366,\n \"lower_value\": 25.382953639506294,\n \"upper_value\": 31.023610003841025\n }\n },\n \"bencher::mock_3\": {\n \"latency\": {\n \"value\": 34.45732560787596,\n \"lower_value\": 31.01159304708836,\n \"upper_value\": 37.903058168663556\n }\n },\n \"bencher::mock_4\": {\n \"latency\": {\n \"value\": 44.9237520767597,\n \"lower_value\": 40.43137686908373,\n \"upper_value\": 49.41612728443567\n }\n }\n}\n"
],
"settings": {},
"start_time": "2023-07-18T14:21:27.773930Z",
"testbed": "base"
}
{
"uuid": "5554a92c-6f5c-481d-bd47-990f0a9bac6d",
"user": { ... },
"project": { ... },
"branch": { ... },
"testbed": { ...},
"start_time": "2023-07-18T14:21:27Z",
"end_time": "2023-07-18T14:21:27Z",
"adapter": "magic",
"results": [
[
{
"measure": { ... },
"threshold": null,
"benchmarks": [ ... ]
}
]
],
"alerts": [],
"created": "2023-07-18T14:21:27Z"
}
View results:
- bencher::mock_0: https://bencher.dev/console/projects/save-walter-white-1234abcd/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=88375e7c-f1e0-4cbb-bde1-bdb7773022ae
- bencher::mock_1: https://bencher.dev/console/projects/save-walter-white-1234abcd/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=e81c7863-cc4b-4e22-b507-c1e238871137
- bencher::mock_2: https://bencher.dev/console/projects/save-walter-white-1234abcd/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=31dede44-d23a-4baf-b639-63f2ac742e42
- bencher::mock_3: https://bencher.dev/console/projects/save-walter-white-1234abcd/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=c7e32369-f3dd-473d-99a3-6289ae32b38e
- bencher::mock_4: https://bencher.dev/console/projects/save-walter-white-1234abcd/perf?measures=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=779bc477-4964-4bae-aa8c-4da3e388822c

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


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

Запустите: export BENCHER_PROJECT=save-walter-white-1234abcd

Если вы затем запустите: echo $BENCHER_PROJECT

Вы должны увидеть:

$ echo $BENCHER_PROJECT
save-walter-white-1234abcd

Давайте заново запустим ту же команду без --project, чтобы сгенерировать больше данных.

Запустите: bencher run "bencher mock"


Теперь давайте сгенерируем больше данных, но на этот раз мы будем передавать наши результаты в bencher run.

Запустите: bencher mock | bencher run


Иногда вы можете захотеть сохранить свои результаты в файл и позволить bencher run их выбрать.

Запустите: bencher run --file results.json "bencher mock > results.json"


Также, вы можете иметь отдельный процесс, запускающий ваши тесты и сохраняющий ваши результаты в файл. Затем bencher run просто их выберет.

Запустите: bencher mock > results.json && bencher run --file results.json


Наконец, давайте забьем много данных с использованием аргумента --iter в bencher run.

Запустите: bencher run --iter 16 "bencher mock"


🐰 Совет: Ознакомьтесь с документацией CLI подкоманды bencher run для полного обзора того, что может сделать bencher run!


Создайте оповещение

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

Запустите: bencher run "bencher mock --pow 8"


В конце вывода должен появиться новый раздел под названием View alerts:

View alerts:
- bencher::mock_0: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/b2329d5a-4471-48ab-bfbd-959d46ba1aa6
- bencher::mock_1: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/181b1cf5-d984-402a-b0f1-68f6f119fa66
- bencher::mock_2: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/b9b6c904-c657-4908-97db-dbeca40f8782
- bencher::mock_3: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/5567ff32-2829-4b6a-969a-af33ce3828db
- bencher::mock_4: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/49f2768f-ccda-4933-8e1d-08948f57a74d

Теперь вы можете увидеть оповещения для каждого теста в браузере. Нажмите или скопируйте и вставьте ссылки из View alerts.


🐰 Совет: Ознакомьтесь с документацией по порогам и оповещениям для полного обзора того, как обнаруживаются регрессии производительности!



🐰 Поздравляем! Вы поймали свою первую регрессию производительности! 🎉


Продолжить: Обзор нагрузочного тестирования ➡

🤖 Этот документ был автоматически создан OpenAI GPT-4. Оно может быть неточным и содержать ошибки. Если вы обнаружите какие-либо ошибки, откройте проблему на GitHub.


Published: Fri, October 27, 2023 at 8:40:00 AM UTC | Last Updated: Wed, March 27, 2024 at 7:50:00 AM UTC