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

Dec 05 2022
Тестирование масштабируемости Locust Python — важная часть подготовки веб-сервиса к работе. Существует множество инструментов для нагрузочного тестирования, таких как Gatling, Apache JMeter, The Grinder, Tsung и другие.

Саранчовый питон

Тестирование масштабируемости является важной частью подготовки производства веб-сервиса. Существует множество инструментов для нагрузочного тестирования, таких как 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