Тестирование PHP-скриптов через cURL
В этой статье я собираюсь рассказывать о достаточно сложных вещах, поэтому если Вы не знаете PHP на должном уровне, то сначала почитайте статьи по основам PHP. На самом деле, материал этой статьи не столько сложен в плане кода, сколько он труден для понимания того, зачем это нужно. Чтобы понять всю важность написания тестов для PHP-скриптов, нужно очень хорошо разбираться в программировании в целом и иметь приличный опыт. Если это так, то из этой статье Вы узнаете, как проводить тестирование PHP-кода через cURL.
Прежде чем приступать к тестированию PHP-скрипта, необходимо его написать, что мы сейчас с Вами и сделаем (файл "script.php"):
<?php
$a = $_POST['a'];
$b = $_POST['b'];
echo $a + $b;
?>
Вот этот скрипт мы теперь должны протестировать на корректную работу. Сейчас наша задача придумать как можно больше тестов, которые будут проверять наш скрипт не только на общие случаи, но и на частные. Вот примерный вариант скрипта, который будет запускать тестирование и выводить его результаты:
<?php
function test($curl, $post, $result) {
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
$out = curl_exec($curl);
if ($out == $result) echo "Тест ($post) пройден";
else echo "Тест ($post) провалился!";
echo "<br />";
}
$start_date = microtime(true);
if( $curl = curl_init() ) {
curl_setopt($curl, CURLOPT_URL, 'http://temp.local/script.php');
curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl, CURLOPT_POST, true);
test($curl, "a=5&b=8", 13);
test($curl, "a=0&b=0", 0);
test($curl, "a=-2&b=2", 0);
test($curl, "a=-2.5&b=7.2", 4.7);
test($curl, "a=5", 5);
curl_close($curl);
}
echo "Время выполнения всех тестов: ".(microtime(true) - $start_date)." секунды";
?>
Что здесь происходит? Во-первых, мы создали функцию "test", которая принимает идентификатор cURL, строку с запросом и ожидаемый результат. В этой функции мы отправляем POST-запрос на наш тестируемый скрипт, получаем от него ответ и сравниваем этот ответ с ожидаемым результатом. Если значения совпадают, значит, тест пройден, если нет, то тест провалился. В примере выше видно, что мы запустили 5 различных тестов, которые проверяют наш скрипт со всех сторон. И Ваша задача состоит в том, чтобы придумывать, как можно больше самых различных вариантов входных данных, и проверять скрипт на корректность работы.
Помимо тестирование результатов PHP-скрипта, мы проверяем и его производительность. Поэтому после выполнения всех тестов мы узнаем, насколько быстро работает наш тестируемый код. Безусловно, это время приблизительно, но здесь главное не точное время. Здесь важно понимать, что код зачастую нуждается в рефакторинге. И после его проведения, надо смотреть, насколько изменилась производительность. И если недостаточно хорошо, то продолжить улучшение кода дальше.
И напоследок поговорим о смысле тестирования кода. Вообще говоря, это относится к любому языку, а не только к PHP. Фактически, при внесении любых изменений в код, Вам не надо вручную прогонять его на самые различные случаи (а их бывает иногда сотни, а то и тысячи). Вы просто запускаете Ваш тест и смотрите: ничего ли не сломалось после Ваших изменений? Таким образом, написание тестов - это очень удобно, очень быстро и очень качественно! И при проектировании сложных систем без написания тестов не обойтись, иначе можно забыть о качестве, производительности и стабильности.
-
- Михаил Русаков
Комментарии (8):
В Вашем примере почему то отработали только те тесты, в которых результат равен 0. Остальные провалились. В чем ошибка? Пыталась привести типы - не помогло.
Ответить
Выведите результаты и проверьте сами, может действительно ошиблись где-то.
Ответить
А у Вас работает? Уже голову сломала. Для проверки в функции перед if вывожу на экран $out и $result - и они равны. Но условие почему-то отрабатывает только если обе переменные равны 0. Код просто скопировала в 2 файла, изначально отсебятины не добавляла. Просто интересно, такой на вид простой код - и где проблема?
Ответить
Если только равные нулю срабатывают, то это похоже на несовпадение типов. Попробуйте сравнить и типы тоже через ===
Ответить
Типы не совпадают. $out - строка, а $result - число. Но ведь по идее строка должна преобразовываться в число? Даже если я пишу intval($out) - тогда ($out) - становится нулем
Ответить
Если сами не преобразуете, то любую строку он будет считать как 0.
Ответить
Этот пример не работает даже с учетом приведения типов. Вы сами пробовали его запускать?
Ответить
Да, у меня то же самое. Правильный результат только там, где нули. Теряется весь смысл урока, если результат не тот. Прошел год, а ошибка та же.
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.