Расширение PHPUnit: добавление декоратора - PullRequest
9 голосов
/ 16 ноября 2011

Контекст

Недавно я унаследовал разработку и обслуживание хорошо запрограммированного PHP-приложения (сарказм).Приложение основано на коммерческом программном обеспечении (которое я не буду называть), и поверх него построен слой настройки (наш).

К сожалению, это приложение использует тонну глобалов и синглетонов (каламбур).Я построил контрольные примеры для всех вещей, которые мы переопределили.Тем не менее, многое зависит от некоторого глобального состояния чего-либо, что может вызвать состояние гонки и всякие странные вещи.

Рандомизация тестов

Для того, чтобы поймать большинство из них weird-o-ton (мне нравится их так называть), я создал 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);
    }
}

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

Вопрос

Проблема возникла, когда пришло время проверить мой кастом декоратор.Я не нашел нигде в руководстве, Google или Stack Overflow, как его загрузить.

При анализе кода я увидел, что сам PHPUnit создает экземпляр декоратора RepeatedTest в методе TextUI_TestRunner::doRun().Я знаю, что могу создать подкласс TestRunner, переопределить doRun(), организовать создание моего декоратора, а затем просто вызвать parent::doRun() с моим экземпляром декоратора в качестве аргумента, переопределить TextUI_Command и создать новый скрипт CLI для использованиямои вещи вместо встроенных.

До того, как я (заново) изобрел колесо, мне было просто интересно, можно ли загрузить собственный декоратор без создания подкласса TestRunner?

Спасибо.

1 Ответ

3 голосов
/ 16 ноября 2011

С текущими версиями PHPUnit, по большей части, нет простого способа вставить свой собственный код. Единственная вещь, которая предлагает взаимозаменяемость - это TestRunner, и то, что вы описали, имеет смысл для меня.

Мне неизвестен какой-либо другой способ предоставления тестовых декораторов или изменения большинства других классов, используемых phpunit.

Кажется, что способ изменить порядок выполнения теста сработает, поэтому я не уверен, насколько хорошо он будет перетасовывать костюмы.


Другим способом достижения этого, возможно, менее трудным, было бы создание подкласса PHPUnit_Framework_TestSuite случайным образом addTest вашего кода.


Если это не сработает, другим вариантом будет использование файла конфигурации xml и создание набора тестов из тегов <file>, и перед каждым выполнением некоторый код перемешивает эти теги. Afaik phpunit никак не сортирует их, поэтому выполнение будет случайным


Ищете ли вы все тесты на работоспособность и хотите найти взаимозависимые тесты?

Или вы действительно хотите увидеть, что что-то ужасно ломается, когда вы делаете много вещей, которые не должны ничего менять в неправильном порядке?

Я спрашиваю на тот случай, если вы еще не рассмотрели --process-isolation. (Что, я полагаю, у вас есть, но спрашивать не повредит и может сэкономить ваше время и усилия :))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...