Учебники

Тестирование нашего образца приложения

В предыдущей главе мы понимали, как использовать Apache Bench для тестирования стороннего веб-сайта. В этом разделе мы будем использовать этот инструмент для тестирования веб-приложения на нашем собственном сервере. Чтобы сохранить самоучитель в максимально возможной степени, мы решили установить приложение Python для демонстрационных целей; Вы можете выбрать любой другой язык, например PHP или Ruby, в зависимости от вашего уровня знаний.

Установка Python

Обычно Python установлен по умолчанию на серверах Linux.

Установка Bottle Framework и создание простого приложения

Bottle — это микро-фреймворк, написанный на python для создания веб-приложений, а pip — менеджер пакетов python. Введите следующую команду в терминале, чтобы установить Bottle —

$ sudo apt-get install python-pip
$ sudo pip install bottle

Давайте теперь создадим маленькое приложение Бутылка. Для этого создайте каталог и переместитесь в него —

$ mkdir webapp
$ cd webapp

Мы создадим новый скрипт python app.py внутри каталога webapp —

$ vim app.py

Теперь напишите следующий код в файле app.py —

from bottle import Bottle, run

app = Bottle()

@app.route('/')
@app.route('/hello')
def hello():
   return "Hello World!"

run(app, host = 'localhost', port = 8080)

После добавления вышеуказанных строк сохраните и закройте файл. Сохранив файл, мы можем запустить скрипт python для запуска приложения —

$ python app.py

Выход

Bottle v0.12.7 server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Hit Ctrl-C to quit.

Эти выходные данные показывают, что наше приложение работает на локальной машине на хосте http: // localhost и прослушивает порт 8080 .

Давайте проверим, правильно ли наше приложение отвечает на запросы HTTP. Поскольку этот терминал не может принимать какие-либо входные данные без выхода из приложения «Бутылка», нам необходимо войти в систему нашего VPS с помощью другого терминала. После входа в VPS с помощью другого терминала вы можете перейти к своему приложению, введя следующий код в новом терминале.

$ lynx http://localhost:8080/

Lynx является браузером командной строки и обычно устанавливается по умолчанию в различных дистрибутивах Linux, таких как Debian и Ubuntu. Если вы видите следующий вывод, это означает, что ваше приложение работает нормально.

Выход

Рысь

Если вы видите вывод выше, это означает, что наше приложение работает и готово к тестированию.

Тестирование приложения с помощью разработанного веб-сервера

Обратите внимание, что в ab есть ошибка, и она не может протестировать приложение на локальном хосте. Поэтому мы изменим хост с localhost на 127.0.0.1 в файле app.py. Таким образом, файл изменится на следующее —

from bottle import Bottle, run

app = Bottle()

@app.route('/')
@app.route('/hello')
def hello():
   return "Hello World!"

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

Давайте теперь протестируем наше приложение, набрав следующую команду на том же терминале, на котором выполнялась команда lynx:

$ ab -n 100 -c 10  http://127.0.0.1:8080/hello

Выход

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:        WSGIServer/0.1
Server Hostname:        127.0.0.1
Server Port:            8080

Document Path:          /hello
Document Length:        12 bytes

Concurrency Level:      10
Time taken for tests:   0.203 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      16500 bytes
HTML transferred:       1200 bytes
Requests per second:    493.78 [#/sec] (mean)
Time per request:       20.252 [ms] (mean)
Time per request:       2.025 [ms] (mean, across all concurrent requests)
Transfer rate:          79.56 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       0
Processing:     1    6  28.2      2     202
Waiting:        1    6  28.2      2     202
Total:          1    6  28.2      2     202

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

В то время как выход на первом терминале будет (100 раз) следующим образом —

...
127.0.0.1 - - [10/Jun/2017 04:30:26] "GET /hello HTTP/1.0" 200 12
127.0.0.1 - - [10/Jun/2017 04:30:26] "GET /hello HTTP/1.0" 200 12
127.0.0.1 - - [10/Jun/2017 04:30:26] "GET /hello HTTP/1.0" 200 12   
...

Вы можете наблюдать, как различные значения исхода АБ изменились по сравнению с первоначальным тестом.

Тестирование приложения с многопоточным веб-сервером

В предыдущих тестах ab мы использовали веб-сервер по умолчанию, входящий в состав среды Bottle.

Теперь мы заменим однопоточный веб-сервер по умолчанию на многопоточный. Поэтому давайте установим многопоточную библиотеку веб-сервера, такую ​​как cherrypy или gunicorn, и попросим Bottle использовать ее. Мы выбрали огнестрельное оружие для демонстрационных целей (вы можете выбрать и другое) —

$  sudo apt-get install gunicorn

И измените файл, то есть изменить с веб-сервера по умолчанию на gunicorn —

...
run(server = 'gunicorn'...)
...

Давайте проверим приложение во втором терминале.

$ ab -n 100 -c 10  http://127.0.0.1:8080/hello

Выход

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:        gunicorn/19.0.0
Server Hostname:        127.0.0.1
Server Port:            8080

Document Path:          /hello
Document Length:        12 bytes

Concurrency Level:      10
Time taken for tests:   0.031 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      17200 bytes
HTML transferred:       1200 bytes
Requests per second:    3252.77 [#/sec] (mean)
Time per request:       3.074 [ms] (mean)
Time per request:       0.307 [ms] (mean, across all concurrent requests)
Transfer rate:          546.36 [Kbytes/sec] received

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

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

Посмотрите, как количество запросов в секунду увеличилось с 493 до 3252. Это означает, что gunicorn подходит в качестве рабочего сервера для приложений на Python.