Jednoczesne testowanie wielu adresów URL

W tym rozdziale dowiemy się, jak testować wiele adresów URL jednocześnie. W tym celu będziemy musieli edytować nasz plik aplikacji app.py, aby zawierał dwa adresy URL -

from bottle import Bottle, run

app = Bottle()

@app.route('/')
@app.route('/hello1')
def hello():
   return "Hello World! It is first URL."

@app.route('/hello2')
def hello():
   return "Hello World! It is second URL."

run(app,server = 'gunicorn',host = '127.0.0.1', port = 8080)

Tworzenie prostego skryptu powłoki

Możesz to zrobić, tworząc skrypt powłoki z wieloma wywołaniami ab. Utwórz plik test.sh i dodaj do niego następujące wiersze -

ab -n 100 -c 10 http://127.0.0.1:8080/hello1 
ab -n 100 -c 10 http://127.0.0.1:8080/hello2

Po dodaniu powyższych wierszy zapisz i zamknij plik. Spraw, aby plik był wykonywalny -

chmod u+x test.sh

Uruchommy teraz skrypt -

./test.sh

Aby uniknąć powtórzeń i przejrzystości, pokażemy tylko istotne dane wyjściowe ab, wskazując kropkami, która część została pominięta, jak poniżej.

Wynik

.
.
.
Document Path:          /hello1
Document Length:        732 bytes

Concurrency Level:      10
Time taken for tests:   0.040 seconds
Complete requests:      100
Failed requests:        0
Non-2xx responses:      100
Total transferred:      90000 bytes
HTML transferred:       73200 bytes
Requests per second:    2496.13 [#/sec] (mean)
Time per request:       4.006 [ms] (mean)
Time per request:       0.401 [ms] (mean, across all concurrent requests)
Transfer rate:          2193.87 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.8      0       3
Processing:     1    3   1.0      4       5
Waiting:        0    3   1.2      4       4
Total:          1    4   0.6      4       5
WARNING: The median and mean for the processing time are not within a normal deviation
        These results are probably not that reliable.
.
.
.

Skrypt powłoki, aby zapisać dane wyjściowe Apache Bench do pliku

Możesz zapisać dane wyjściowe Apache Bench do pliku, tworząc skrypt powłoki z wieloma wywołaniami ab. Na końcu każdego wiersza umieść plik&;powoduje to, że polecenie działa w tle, a następne polecenie rozpoczyna jego wykonanie. Będziesz także chciał przekierować dane wyjściowe do pliku dla każdego adresu URL za pomocą <nazwa pliku>. Na przykład nasz plik test.sh po modyfikacji będzie wyglądał następująco -

$ ab -n 100 -c 10 http://127.0.0.1:8080/hello1 > test1.txt &
$ ab -n 100 -c 10 http://127.0.0.1:8080/hello2 > test2.txt &

Tutaj, test1.txt i test2.txt to pliki do zapisania danych wyjściowych.

Możesz sprawdzić, czy powyższy skrypt utworzył dwa pliki, test1.txt i test2.txt, które zawierają dane wyjściowe ab dla odpowiednich adresów URL -

$ ls -l

Wynik

...
-rw-r--r-- 1 root root  5225 May 30 12:11 out.data
-rwxr--r-- 1 root root   118 Jun 10 12:24 test.sh
-rw-r--r-- 1 root root  1291 Jun 10 12:31 test1.txt
-rwxr--r-- 1 root root    91 Jun 10 13:22 test2.sh
-rw-r--r-- 1 root root  1291 Jun 10 12:31 test2.txt
...

Sytuacja uważna

Używając ab, powinieneś być czujny na niepowodzenie testu bez ostrzeżenia. Na przykład, jeśli sprawdzisz zły adres URL, możesz otrzymać coś podobnego do następującego (celowo zmieniliśmy tutaj port).

$ ab -l -r -n 100 -c 10 -k -H "Accept-Encoding: gzip, deflate"  http://127.0.0.1:805/

Wynik

This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient).....done

Server Software:
Server Hostname:        127.0.0.1
Server Port:            805

Document Path:          /
Document Length:        Variable

Concurrency Level:      10
Time taken for tests:   0.002 seconds
Complete requests:      100
Failed requests:        150
   (Connect: 0, Receive: 100, Length: 0, Exceptions: 50)
Keep-Alive requests:    0
Total transferred:      0 bytes
HTML transferred:       0 bytes
Requests per second:    44984.26 [#/sec] (mean)
Time per request:       0.222 [ms] (mean)
Time per request:       0.022 [ms] (mean, across all concurrent requests)
Transfer rate:          0.00 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     0    0   0.2      0       0
Waiting:        0    0   0.0      0       0
Total:          0    0   0.2      0       0

Percentage of the requests served within a certain time (ms)
  50%      0
  66%      0
  75%      0
  80%      0
  90%      0
  95%      0
  98%      0
  99%      0
 100%      0 (longest request)