Вы можете провести модульное тестирование процедурного PHP, без проблем. И вам определенно не повезло, если ваш код смешан с HTML.
На уровне приложения или приемочного теста ваш процедурный PHP, вероятно, зависит от значения суперглобальных переменных ($_POST, $_GET, $_COOKIE
и т. Д.) Для определения поведения и заканчивается включением файла шаблона и выпуском вывода.
Чтобы выполнить тестирование на уровне приложения, вы можете просто установить суперглобальные значения; запустите выходной буфер (чтобы не допустить попадания html на ваш экран); позвоните на страницу; отстаивать вещи внутри буфера; и очистите буфер в конце.
Итак, вы можете сделать что-то вроде этого:
public function setUp()
{
if (isset($_POST['foo'])) {
unset($_POST['foo']);
}
}
public function testSomeKindOfAcceptanceTest()
{
$_POST['foo'] = 'bar';
ob_start();
include('fileToTest.php');
$output = ob_get_flush();
$this->assertContains($someExpectedString, $output);
}
Даже для огромных "фреймворков" с большим количеством включений этот вид тестирования покажет вам, работают ли функции уровня приложения или нет. Это будет действительно важно, когда вы начнете улучшать свой код, потому что даже если вы уверены, что коннектор базы данных по-прежнему работает и выглядит лучше, чем раньше, вам нужно нажать кнопку и увидеть, что да, вы все еще можете войти и выйти через базу данных.
На более низких уровнях имеются незначительные различия в зависимости от области действия переменной и от того, работают ли функции с побочными эффектами (возвращая истину или ложь) или возвращая результат напрямую.
Переменные передаются явно, как параметры или массивы параметров между функциями? Или переменные установлены в разных местах и неявно переданы как глобальные переменные? Если это (хороший) явный случай, вы можете выполнить модульное тестирование функции путем (1) включения файла, содержащего функцию, затем (2) прямой подачи значений функциональных тестов и (3) захвата выходных данных и утверждения против них. Если вы используете глобальные переменные, вам просто нужно быть очень осторожным (как указано выше в примере с $ _POST), чтобы тщательно обнулить все глобальные переменные между тестами. Также особенно полезно сохранять очень маленькие тесты (5-10 строк, 1-2 утверждения) при работе с функцией, которая выталкивает и вытягивает множество глобальных переменных.
Другая основная проблема заключается в том, работают ли функции, возвращая выходные данные или изменяя передаваемые параметры, возвращая вместо этого значения true / false. В первом случае тестирование проще, но опять же, это возможно в обоих случаях:
// assuming you required the file of interest at the top of the test file
public function testShouldConcatenateTwoStringsAndReturnResult()
{
$stringOne = 'foo';
$stringTwo = 'bar';
$expectedOutput = 'foobar';
$output = myCustomCatFunction($stringOne, $stringTwo);
$this->assertEquals($expectedOutput, $output);
}
В плохом случае, когда ваш код работает с побочными эффектами и возвращает true или false, вы все равно можете довольно легко протестировать:
/* suppose your cat function stupidly
* overwrites the first parameter
* with the result of concatenation,
* as an admittedly contrived example
*/
public function testShouldConcatenateTwoStringsAndReturnTrue()
{
$stringOne = 'foo';
$stringTwo = 'bar';
$expectedOutput = 'foobar';
$output = myCustomCatFunction($stringOne, $stringTwo);
$this->assertTrue($output);
$this->Equals($expectedOutput, $stringOne);
}
Надеюсь, это поможет.