Testy warunków skrajnych Fastapi

Dec 05 2022
Testowanie skalowalności Locust Python jest ważną częścią przygotowania do produkcji usługi sieciowej. Istnieje wiele narzędzi do testowania obciążenia, takich jak Gatling, Apache JMeter, The Grinder, Tsung i inne.

Pyton szarańczy

Testowanie skalowalności jest ważną częścią przygotowania do produkcji usług internetowych. Istnieje wiele narzędzi do testowania obciążenia, takich jak Gatling, Apache JMeter, The Grinder, Tsung i inne. Jest też jeden (i mój ulubiony) napisany w Pythonie i zbudowany na bibliotece Requests : Locust .

Jak zauważono na stronie Locust:

Podstawową cechą Locust jest to, że opisujesz wszystkie swoje testy w kodzie Pythona. Nie ma potrzeby niezgrabnych interfejsów użytkownika ani rozdętego kodu XML, wystarczy zwykły kod.

Instalacja szarańczy

Moduł Pythona do testowania wydajności Locust jest dostępny na PyPI i może być zainstalowany przez pip lub easy_install.

pip install locustio or: easy_install locust

Przykład locustfile.py

Następnie utwórz locustfile.py zgodnie z przykładem z dokumentów. Aby przetestować projekt Django musiałem dodać kilka nagłówków dla obsługi csrftoken i żądań ajax. Końcowy plik locustfile.py może wyglądać następująco:

# 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

Aby uruchomić Locust z powyższym plikiem locust python, jeśli nazywał się locustfile.py , moglibyśmy uruchomić (w tym samym katalogu co locustfile.py ):

locust --host=http://example.com

Po uruchomieniu aplikacji Locust do testowania obciążenia Pythona powinieneś odwiedzićhttp://127.0.0.1:8089/i tam znajdziesz web-interfejs naszej instancji Locust. Następnie wprowadź Liczba użytkowników do symulacji (np. 300) i Współczynnik wylęgu (użytkownicy spawnowani/sekundę) (np. 10) i naciśnij Start swarming . Następnie Locust zacznie „wykluwać” użytkowników i będziesz mógł zobaczyć wyniki w tabeli.

Wizualizacja danych w Pythonie

Tak więc tabela jest ładna, ale wolelibyśmy zobaczyć wyniki na wykresie. Istnieje problem , w którym ludzie proszą o dodanie interfejsu graficznego do Locust i istnieje kilka propozycji, jak wyświetlić wykresy dla danych Locust. Zdecydowałem się na interaktywną bibliotekę wizualizacji Python Bokeh .

Łatwo jest zainstalować bibliotekę graficzną Pythona Bokeh z PyPI za pomocą pip:

pip install bokeh

Oto przykład uruchomienia serwera Bokeh.

Możemy uzyskać dane Locust w formacie JSON odwiedzająchttp://localhost:8089/stats/requests. Dane powinny mieć coś takiego:

{
       "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
    }

Bieganie razem

Tak więc nasza Locust działa (jeśli nie, zacznij od locust --host=http://example.com) i teraz powinniśmy zacząć Bokehserverod bokeh serve, a następnie uruchomić nasz plotter.py z python plotter.py. Jak pokazują nasze wywołania skryptu , karta przeglądarki jest automatycznie otwierana pod właściwym adresem URL, aby wyświetlić dokument.

Jeśli Locust już przeprowadza test, natychmiast zobaczysz wyniki na wykresach. W przeciwnym razie rozpocznij nowy test o godzhttp://localhost:8089/i wróć do zakładki Bokeh i obserwuj wyniki testów w czasie rzeczywistym.

Otóż ​​to. Cały kod można znaleźć na githubie . Możesz go sklonować i uruchomić przykład.

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