Стресс-тестирование Fastapi

Саранчовый питон
Тестирование масштабируемости является важной частью подготовки производства веб-сервиса. Существует множество инструментов для нагрузочного тестирования, таких как Gatling, Apache JMeter, The Grinder, Tsung и другие. Также есть один (и мой любимый), написанный на Python и построенный на библиотеке Requests : Locust .
Как отмечено на сайте Locust:
Фундаментальной особенностью Locust является то, что вы описываете все свои тесты в коде Python. Нет необходимости в неуклюжих пользовательских интерфейсах или раздутом XML, просто код.
Установка саранчи
Модуль Python для тестирования производительности Locust доступен на PyPI и может быть установлен через pip или easy_install.
pip install locustio or: easy_install locust
Пример locustfile.py
Затем создайте файл locustfile.py по примеру из документации. Чтобы протестировать проект Django, мне пришлось добавить несколько заголовков для поддержки csrftoken и запросов ajax. Окончательный файл locustfile.py может выглядеть примерно так:
# locustfile.py
from locust import HttpLocust, TaskSet, task
class UserBehavior(TaskSet):
def on_start(self):
self.login()
def login(self):
# GET login page to get csrftoken from it
response = self.client.get('/accounts/login/')
csrftoken = response.cookies['csrftoken']
# POST to login page with csrftoken
self.client.post('/accounts/login/',
{'username': 'username', 'password': 'P455w0rd'},
headers={'X-CSRFToken': csrftoken})
@task(1)
def index(self):
self.client.get('/')
@task(2)
def heavy_url(self):
self.client.get('/heavy_url/')
@task(2)
def another_heavy_ajax_url(self):
# ajax GET
self.client.get('/another_heavy_ajax_url/',
headers={'X-Requested-With': 'XMLHttpRequest'})
class WebsiteUser(HttpLocust):
task_set = UserBehavior
Чтобы запустить Locust с указанным выше файлом саранчи python, если бы он был назван locustfile.py , мы могли бы запустить (в том же каталоге, что и locustfile.py ):
locust --host=http://example.com
Когда запущено приложение Locust для нагрузочного тестирования Python, вы должны посетитьhttp://127.0.0.1:8089/и там вы найдете веб-интерфейс нашего экземпляра Locust. Затем введите Количество пользователей для имитации (например, 300) и Скорость вылупления (порожденных пользователей в секунду) (например, 10) и нажмите Начать роение . После этого Locust начнет «высиживать» пользователей, и вы сможете увидеть результаты в таблице.
Визуализация данных Python
Итак, таблица хороша, но мы бы предпочли увидеть результаты на графике. Есть проблема , в которой люди просят добавить графический интерфейс в Саранчу, и есть несколько предложений, как отображать графики для данных Саранчи. Я решил использовать библиотеку интерактивной визуализации Python Bokeh .
Легко установить графическую библиотеку Python Bokeh из PyPI, используя pip:
pip install bokeh
Вот пример запуска сервера Bokeh.
Мы можем получить данные о саранче в формате JSON, посетивhttp://localhost:8089/stats/requests. Данные там должны быть примерно такие:
{
"errors": [],
"stats": [
{
"median_response_time": 350,
"min_response_time": 311,
"current_rps": 0.0,
"name": "/",
"num_failures": 0,
"max_response_time": 806,
"avg_content_length": 17611,
"avg_response_time": 488.3333333333333,
"method": "GET",
"num_requests": 9
},
{
"median_response_time": 350,
"min_response_time": 311,
"current_rps": 0.0,
"name": "Total",
"num_failures": 0,
"max_response_time": 806,
"avg_content_length": 17611,
"avg_response_time": 488.3333333333333,
"method": null,
"num_requests": 9
}
],
"fail_ratio": 0.0,
"slave_count": 2,
"state": "stopped",
"user_count": 0,
"total_rps": 0.0
}
Бежим все вместе
Итак, наш Locust запущен (если нет, начните его с locust --host=http://example.com
), и теперь мы должны начать Bokehserver
с bokeh serve
, а затем запустить наш plotter.py с python plotter.py
. Как показывают вызовы нашего скрипта , вкладка браузера автоматически открывается с правильным URL-адресом для просмотра документа.
Если Locust уже запускает тест, вы сразу же увидите результаты на графиках. В противном случае начните новый тест вhttp://localhost:8089/и вернитесь на вкладку Боке и наблюдайте за результатами тестирования в режиме реального времени.
Вот и все. Вы можете найти весь код на github . Не стесняйтесь клонировать его и запускать пример.
git clone https://github.com/steelkiwi/locust-bokeh-load-test.git
cd locust-bokeh-load-test
pip install -r requirements.txt
locust --host=<place here link to your site>
bokeh serve
python plotter.py