AB testów wydajnościowych

Żeby przetestować wydajność aplikację webowej od A do Z trzeba się nieźle nagimnastykować. Jeśli jednak wystarczą powierzchowne testy, dajmy na to od A do B, to jest na to prosty sposób: ab czyli Apache Benchmark.

Apache Benchmark dobrze się sprawdzi np. w takich scenariuszach:

  • sprawdzenie czy refaktoring konkretnej końcówki API przyniósł wzrost wydajności,
  • testowanie różnych ustawień serwera,
  • obciążenie aplikacji celem sprawdzenia czy autoskalowanie działa.

W poniższych przykładach podaję tylko te argumenty ab, które są istotne dla danego przykładu. W prawdziwych zastosowaniach trzeba do nich dodać np. liczbę zapytań i liczbę równoczesnych zapytań.

Pomijanie loadbalancera

Obecnie serwery aplikacji są częstokroć schowane za loadbalancerem. Testując aplikację najczęściej chcemy uderzać bezpośrednio w nią. W tym celu należy wysłać nagłówek Host zawierający domenę aplikacji, a w URL-u podać serwer z aplikacją (domena lub IP):

ab -H "Host: api.example.org" http://10.1.1.10/endpoint

Autoryzacja

Tu również najczęściej wystarczy podać jeden nagłówek, a konkretnie Authorization:

ab -H "Authorization: Bearer wygenerowany-token" https://api.example.org/endpoint

Formularz

Żeby wysłać formularz metodą POST należy przygotować plik z zawartością formularza. Klucze i wartości powinny być rozdzielone znakiem równości, a kolejne krotki oddzielone znakiem &. Należy pamiętać o kodowaniu znaków niealfanumerycznych. Przykład:

parametr1=wartosc&parametr2=wartosc%20ze%20spacjami&parametr=dodatkowy

Uwaga: wiele edytorów automatycznie wstawia znak nowej linii na końcu każdego wiersza, co ab zinterpretuje jako część ostatniej wartości, co może prowadzić do trudnych do wykrycia błędów. Można to obejść na końcu umieszczając dodatkowy parametr.

Tak przygotowany plik należy podać jako argument dla ab wraz z kodowaniem:

ab -p form-data.txt -T 'application/x-www-form-urlencoded’ https://api.example.org/endpoint

PUT

Poniżej przykład testowania końcówki metodą PUT:

ab -m PUT -H 'Content-Length: 0' https://api.example.org/endpoint/id

Testowana końcówka nie wymaga przesłania danych innych niż te z URL-a, więc niezbędny jest nagłówek Content-Length z wartością 0, bez niego aplikacja rzucała błąd mówiący o niemożliwości sparsowania żądania.

Docker

A co jeśli na maszynce nie ma ab? Jeśli jest Docker to można zrobić:

docker run cmd.cat/ab ab -n 10000 -c 10 https://api.example.org/endpoint

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *