2016-09-01 2 views
10

Я тестировал свой код, чтобы проверить, как он будет себя вести, если мы думаем, что 100 пользователей представили свою регистрацию сразу!Проблема во время модульного тестирования производительности кода

Мой код находится в PHP Laravel 5.2 и JQuery Ajax ниже.

for (i = 0; i < 100; i++) { 
    var 
    data={'Role' : "Role"+i}, 
    request = $.ajax({ 
     url:    'http://localhost:1234/Practise/public/api/SaveRoleApi', 
     type:    "POST", 
     data:    JSON.stringify(data), 
     contentType:  "application/json; charset=utf-8", 
     async: true, 
     success: function(d){ console.log(d); } 
    }); 
} 

Из 100, мне не удалось отправить более 88 записей.

Я использую базу данных MySQL.

если мой выше код будет добавлять записи последовательно ... id есть способ протестировать 1000 одновременных запросов с одного компьютера?

+0

Это проверит 100 последовательных запросов, а не 100 одновременных запросов. –

+0

№ Пожалуйста, проверьте 'async: true,' in ajax – Pankaj

+0

Используйте Apache Benchmark, JMeter, загрузчик, чтобы сделать это. Написание ajax в цикле является наихудшим методом тестирования производительности. Также читайте о блокировке в MySql. –

ответ

1

Я бы предложил использовать инструмент для этой цели, например loader. Имейте в виду, что ваше веб-приложение должно быть доступно из внешнего мира.

+0

Я не могу использовать это, потому что моей таблице db нужны уникальные записи. Этот инструмент не позволит проводить такое параллельное тестирование. – Pankaj

+0

Я уверен, что вы можете использовать его так, как хотите. Посмотрите файлы с полезной нагрузкой (http://support.loader.io/article/17-payload-files#variable-sets)? – geoandri

3

Попытка нескольких запросов из одного браузера с использованием JavaScript для создания всех соединений не является хорошей идеей, вы действительно не очень хорошо проверяете параллелизм.

Рассмотрите возможность использования реального инструмента тестирования нагрузки, такого как JMeter (я определенно рекомендую это) или, по крайней мере, параллельных запросов на завивки в пакетном скрипте.

for n in {1..1000}; do 
    for i in `eval echo {$n..$((n+999))}`; do 
      echo "club $i..." 
      curl -X POST -H "Content-Type: application/json" -d '{"param1":"xyz","param2":"xyz"}' -s "http://localhost:1234/Practise/public/api/SaveRoleApi" >> log.txt 
    done & 
    wait 
done 
+0

Но, где речь идет об асинхронном режиме? – Pankaj

+0

Опять же, я советую вам использовать для этого реальный инструмент. Но в случае сценария командной строки '&' at после 'done', что он делает, чтобы сообщить оболочке запустить это в отдельном потоке, так что все из них выполняются параллельно. –

+0

Какой инструмент? Плохо, если я тестирую параллельный запрос. – Pankaj

0

Возможно, вы захотите изучить возможности многофункционального PHP curl. http://php.net/manual/en/function.curl-multi-init.php

$mh = curl_multi_init(); 
$ch = []; 
for ($i = 1; $i < 100; $i++) { 
    $data = "Role=Role$i"; 
    $ch[$i] = curl_init(); 
    curl_setopt($ch[$i], CURLOPT_URL, 'http://localhost:1234/Practise/public/api/SaveRoleApi'); 
    curl_setopt($ch[$i], CURLOPT_POST, 1); // Number of post fields, in this case just one. 
    curl_steopt($ch[$i], CURLOPT_POSTFIELDS, $data); 
    curl_multi_add_handle($mh, $ch[$i]); 
} 
$active = null; 
do { 
    $mrc = curl_multi_exec($mh, $active); 
} while ($mrc = CURLM_CALL_MULTI_PERFORM); 
while ($active and $mrc == CURLM_OK) { 
    if(curl_multi_select($mh) !== -1) { 
     do { 
      $mrc = curl_multi_exec($mh, $active); 
     } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
    } 
} 
for($i = 0; $i < 100; $i++){ 
    curl_multi_remove_handle($mh, $ch[$i]); 
} 
curl_multi_close($mh); 
+0

Но, где речь идет об асинхронном запросе? – Pankaj

+0

curl_multi является асинхронным, поскольку ссылка находится в верхней части страницы. – Jantho1990

Смежные вопросы