Как на самом деле запускать тесты PHPUnit в определенном порядке

На этот вопрос: Выполнить тесты PHPUnit в определенном порядке есть принятый ответ, с которым я согласен, но проблема дизайна связана с PHP и PHPUnit.

В проекте, который я тестирую, используются ZF2 и Doctrine. AbstractHttpControllerTestCase имеет метод «отправка», который создает экземпляр приложения ZF2 и проходит все этапы создания объекта Response. Эти тесты снабжены аннотацией @covers, чтобы гарантировать, что другие методы не охватываются выполнением запросов во время теста. Запросы могут включать сценарии представления, которые вызывают вспомогательные функции представления, использующие все виды служб, поэтому становится невозможным имитировать все службы, используемые во время данного запроса (и этот код станет утомительным для копирования и поддержки для каждого теста).

PHPUnit имеет возможность запускать тесты в отдельном процессе, он делает это, разветвляя новый экземпляр PHP и передавая ему скомпилированные шаблоны кода (странные вещи). Затем он будет включать в себя все файлы, перечисленные функцией get_included_files(), включая все, что когда-либо попадало в автозагрузчик. Даже с отключенным saveGlobalState он по-прежнему будет включать все, что было затронуто всеми предыдущими тестами в новом процессе.

Некоторые зависимости (установленные через композитор) используют статические методы, классы, помеченные как final, или и то, и другое. PHPUnit может имитировать статические методы, конечные классы должны быть перегружены с помощью Mockery, так как PHPUnit категорически отказывается создавать фиктивные объекты финальных классов. Перегрузка классов и функций (используя трюк с пространством имен) должна выполняться в отдельных процессах, чтобы не влиять на последующие тесты. Все идет нормально.

Введите тест, который перегружает зависимость, чтобы установить ожидания для статических методов (для класса, который может быть или не быть помечен как окончательный) или для установки ожиданий для объектов, которые еще не созданы. Это будет работать только в том случае, если ни один из предыдущих тестов никогда не касался класса для перегрузки и установки ожиданий, или он завершится с ошибкой «невозможно повторно объявить класс». PHPUnit пытался быть полезным и включал все для воссоздания тестовой среды в подпроцессе, но в результате разрушал тестовый пример.

Поэтому было бы невероятно полезно пометить тесты, например. "@group изолирован" и запускать эти тесты перед любыми другими тестами без необходимости дважды вызывать PHPUnit (помимо неудобств, это испортит анализ покрытия).

В качестве альтернативы, если есть способ переопределить класс, который уже существует в PHP 5.5, это позволит затронутому тестовому примеру исправить свое предварительное условие. Но этого, вероятно, не произойдет (ранкит в любом случае не является приемлемым ответом).


person user168660    schedule 21.08.2013    source источник