Тестирование PHP-скриптов через cURL


Тестирование 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. Фактически, при внесении любых изменений в код, Вам не надо вручную прогонять его на самые различные случаи (а их бывает иногда сотни, а то и тысячи). Вы просто запускаете Ваш тест и смотрите: ничего ли не сломалось после Ваших изменений? Таким образом, написание тестов - это очень удобно, очень быстро и очень качественно! И при проектировании сложных систем без написания тестов не обойтись, иначе можно забыть о качестве, производительности и стабильности.