Монтаж
Поскольку Magento 1 не использует композитор из коробки, я не думаю , что это имеет большое значение , если установить PHPUnit с помощью композитора или просто скачать Фары версию.
Если вы уже используете composer для управления сторонними модулями или библиотеками на вашем сайте, то, вероятно, в этом есть смысл. Если вы не используете PHP7, вы будете ограничены старой версией phpunit (вот почему я ссылался на версию 4.8 выше).
Интеграционные тесты против / и / или модульные тесты
Поскольку Magento 1 является настолько тяжелым приложением, имеет смысл разделить загрузчик phpunit на один для интеграции и один для модульных тестов.
Для начальной загрузки модульного теста требуется только инициализация автозагрузчика, а для начальной загрузки интеграционного теста требуется инициализация всей среды приложения, включая загрузку конфигурации и соединение базы данных.
Из-за этого интеграционные тесты в Magento имеют тенденцию выполняться намного медленнее, чем модульные тесты (даже в большей степени, чем в других приложениях).
Начальная загрузка Magento в phpunit
Автозагрузчик Magento не совместим с PSR-0, поскольку выдает исключение, если не может найти файл, в котором находится класс. Это нарушает некоторые class_exists
способы использования в phpunit. Есть несколько возможных (если хакерских) обходных путей:
- Отмените регистрацию автозагрузчика Magento, обернув его
\Varien_Autoload::autoload()
в декораторе, игнорируя возникающие исключения, и зарегистрируйте обертку как новый автозагрузчик. Это имеет низкую вероятность конфликтов со сторонними библиотеками, которые регистрируют автозагрузчики и зависят от определенного порядка автозагрузчика.
- Используйте пользовательский обработчик ошибок, заключающий в себе встроенный в Magento 1. Пользовательский обработчик ошибок проглатывает ошибки, вызванные автозагрузчиком Magento. Это решение, которое использует тестовая среда Рафаэля . Кажется, это наиболее совместимо с другими сторонними расширениями.
- Используйте взломать путь включения, чтобы переопределить,
\Varien_Autoload::autoload()
чтобы не выдавать ошибку, если файл не существует. Это, однако, конфликтует с несколькими модулями, которые также перекрывают один и тот же класс. Я не использую этот подход сам.
Чтобы избежать ошибок в сеансе, запускаемом во время тестов, просто задайте его $_SESSON = []
в начальной загрузке.
Установите пользовательский объект ответа через Mage::app()->setResponse($testResponse)
который расширяет реальный объект , но не отправляет выходные данные или заголовки.
Для повторной инициализации Magento между интеграционными тестами, которые полностью изменяют состояние времени выполнения, используйте Mage::reset(); Mage::app()
. Обратите внимание, что после этого обработчик ошибок должен быть перекрашен.
арматура
Для осветителей DB я обычно использую обычные модели в методах осветителей для создания осветителей, например createSimpleProduct($sku)
. Как сказал Рафаэль, используйте setUp()
и, tearDown()
чтобы обернуть тест в транзакцию, которая откатывается после теста (например Mage::getSingleton('core/resource')->getConnection('default_setup')->beginTransaction()
).
Для приборов конфигурации магазина я стараюсь использовать только встроенные в память приборы Mage::app()->getStore()->setConfig($path, $value)
.
EcomDev_PHPUnit
Расширение также предоставляет возможность для создания БД приборов с помощью YAML файлов, но для себя я считаю , тем труднее поддерживать по сравнению с сантехникой , созданной с использованием модели классов. YMMV.
Test Doubles
Реестр может быть использован для вставки тестовых двойников для объектов, созданных с помощью Mage::getSingleton()
, Mage::getResourceSingleton()
и Mage::helper()
.
Некоторые другие центральные объекты могут быть установлены Mage::app()
(например, запрос).
Чтобы заменить классы, созданные с помощью Mage::getModel()
или Mage::getResourceModel()
с тестовыми двойниками, необходимо использовать пользовательскую оболочку объекта конфигурации . Посмотрите этот пример в тестовой среде Рафаэля, как это можно сделать.
Резюме
Как только Magento загружается, почти все можно довольно хорошо протестировать. Будьте готовы создавать глубокие макеты из-за большого количества цепочек методов, используемых в основном коде.
Несмотря на то, что настройки не очень удачные, они хорошо работают, и я считаю, что тесты придают мне большую уверенность и ценность, в значительной степени сопоставимые с набором тестов для приложения Symphony.