Недавно я унаследовал разработку и сопровождение хорошо запрограммированного приложения PHP (сарказм). Приложение основано на коммерческом программном обеспечении (которое я не буду называть), и на нем есть уровень настройки (наш).
К сожалению, это приложение использует тонну глобальных и одиночных объектов (каламбур). Я создал тестовые примеры для всех вещей, которые мы переопределили. Однако многое зависит от какого-то глобального состояния чего-то, что может вызывать состояния гонки и всевозможные странные вещи.
Чтобы поймать большую часть этих чудаковатых (я люблю их так называть), я создал PHPUnit TestDecorator
, [ как описано в руководстве] [1]. Этот:
class PHPUnit_Extensions_Randomizer extends PHPUnit_Extensions_TestDecorator
{
public function __construct(PHPUnit_Framework_Test $test)
{
$tests = $test->tests();
$shuffle = array();
foreach ($tests as $t) {
if ($t instanceof PHPUnit_Framework_TestSuite) {
$shuffle = array_merge($shuffle, $t->tests());
} else {
$shuffle[] = $t;
}
}
shuffle($shuffle);
$suite = new PHPUnit_Framework_TestSuite();
foreach ($shuffle as $t) $suite->addTest($t);
parent::__construct($suite);
}
}
Он в основном рандомизирует порядок тестов, чтобы убедиться, что тест не зависит от глобального состояния, которое может быть правильным, а может и нет.
Проблема возникла, когда пришло время протестировать мой собственный декоратор. Я нигде не нашел ни в мануале, ни в гугле, ни в Stack Overflow, как его загрузить.
При анализе кода я увидел, что сам PHPUnit создает экземпляр декоратора RepeatedTest
в методе TextUI_TestRunner :: doRun ()
. Я знаю, что могу создать подкласс TestRunner
, переопределить doRun ()
, организовать создание декоратора, а затем просто вызвать parent :: doRun ()
с помощью мой экземпляр декоратора в качестве аргумента, переопределите TextUI_Command
и создайте новый сценарий CLI для использования моих материалов вместо встроенных.
Перед тем, как (заново) изобрести колесо, я просто задавался вопросом, можно ли загрузить собственный декоратор без создания подкласса TestRunner?
Спасибо.