Статьи

pTest: PHP Unit Tester в 9 строках кода

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

Мне не требовалась поддержка фиктивных объектов или сложных утверждений — достаточно простого assertTrue() Итак, я представляю «pTest» в 9 строках кода:

 
/**
 * pTest - PHP Unit Tester
 * @param mixed $test Condition to test, evaluated as boolean
 * @param string $message Descriptive message to output upon test
 */
function assertTrue($test, $message)
{
	static $count;
	if (!isset($count)) $count = array('pass'=>0, 'fail'=>0, 'total'=>0);

	$mode = $test ? 'pass' : 'fail';
	printf("%s: %s (%d of %d tests run so far have %sed)n",
		strtoupper($mode), $message, ++$count[$mode], ++$count['total'], $mode);
}

Вот несколько надуманных тестовых примеров для демонстрации:

 
assertTrue(1 + 1 == 2, 'one plus one should equal two');
assertTrue(false, 'false should be true (this one will fail)');
assertTrue(!false, 'false should be false');

И пример вывода:


PASS: один плюс один должен равняться двум (1 из 1 проведенных тестов пройден)
FAIL: false должно быть true (этот не пройдёт) (1 из 2 тестов, выполненных до сих пор, не пройден)
PASS: false должно быть false (2 из 3 выполненных тестов пройдены)

Если вы просматриваете вывод в веб-браузере, вы можете легко обернуть каждое выходное сообщение в тег <p>. Или, если вы используете неработающий браузер, вы можете отправить ответ с header('Content-Type: text/plain'); ,

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

Еще одно применение для такой простой функции тестирования — это введение непосвященных в мир модульного тестирования. Я знаю, что до того, как я начал заниматься этим, самым большим препятствием была сложность фреймворков. Возможно, pTest даст начинающим отправную точку, с которой они могут перейти на более многофункциональные фреймворки, такие как PHPUnit или SimpleTest, когда они перерастут скромный assertTrue()