Расширение PHPUnit: добавление декоратора

Контекст

Недавно я унаследовал разработку и сопровождение хорошо запрограммированного приложения 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?

Спасибо.

9
задан netcoder 16 November 2011 в 13:54
поделиться