Ż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¶metr2=wartosc%20ze%20spacjami¶metr=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