Когда я пишу свои модули, я пытаюсь снабдить их модульными тестами для наиболее важных частей приложения. Однако на данный момент (Magento 2.1.3) существует несколько способов написания модульных тестов:
Разные способы тестирования
- Интегрируйте его
bin/magento dev:tests:run unit
и запустите поверх стандартных настроек phpunit, входящих в комплект Magento. - Запишите их отдельно, запустите их
vendor/bin/phpunit app/code/Vendor/Module/Test/Unit
и высмеивайте все, что есть Magento. - Напишите их отдельно, смоделируйте все и используйте глобально-системную версию PHPUnit.
- Напишите их отдельно, запустите их
vendor/bin/phpunit
, но все же используйте\Magento\Framework\TestFramework\Unit\Helper\ObjectManager
.
Magento 2 и PHPUnit
Кроме того, Magento 2 поставляется в комплекте с PHPUnit 4.1.0, который не совместим с PHP7. Нативные подсказки типов (вроде string
и `int) и объявление возвращаемых типов в ваших подписях приведут к ошибкам. Например, интерфейс / класс с сигнатурой метода, подобной этой:
public function foo(string $bar) : bool;
... не сможет быть высмеянным PHPUnit 4.1.0. :-(
Моя текущая ситуация
Это связано с тем, что сейчас я в основном пишу свои модульные тесты третьим способом (вызывая глобальную версию PHPUnit).
В моей установке PHPUnit 5.6 установлен глобально, поэтому я могу решить написать правильный PHP7-код, но я должен сделать некоторые изменения. Например:
phpunit.xml
должен выглядеть так, чтобы я мог использовать автозагрузчик композитора:
<?xml version="1.0"?>
<phpunit bootstrap="../../../../../../vendor/autoload.php"
colors="true">
<testsuites>
<testsuite name="Testsuite">
<directory>.</directory>
</testsuite>
</testsuites>
</phpunit>
... и во всех моих setUp()
-методах у меня есть следующая проверка, чтобы я мог писать свои тесты с прямой совместимостью:
// Only allow PHPUnit 5.x:
if (version_compare(\PHPUnit_Runner_Version::id(), '5', '<')) {
$this->markTestSkipped();
}
Таким образом, когда мои тесты запускаются встроенным в Magentos PHPUnit, это не выдает ошибку.
Мой вопрос
Итак, вот мой вопрос: это «здоровый» способ написания юнит-тестов? Потому что мне кажется неправильным, что Magento поставляется с целым набором инструментов для помощи в тестировании, и я не могу их использовать, потому что я использую PHP7. Я знаю, что на GitHub есть билеты для решения этой проблемы, но мне интересно, как сообщество в настоящее время пишет свои тесты.
Есть ли способ написать модульные тесты в Magento 2, так что мне не нужно «понижать» мой код, и я все еще могу использовать встроенные в Magentos помощники для насмешки над всем, к чему прикасается менеджер объектов? Или даже плохая практика использовать диспетчер объектов даже в ваших модульных тестах?
Я упускаю множество рекомендаций / примеров того, как правильно проводить модульное тестирование ваших собственных пользовательских модулей.