Когда я пишу свои модули, я пытаюсь снабдить их модульными тестами для наиболее важных частей приложения. Однако на данный момент (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 помощники для насмешки над всем, к чему прикасается менеджер объектов? Или даже плохая практика использовать диспетчер объектов даже в ваших модульных тестах?
Я упускаю множество рекомендаций / примеров того, как правильно проводить модульное тестирование ваших собственных пользовательских модулей.
источник
Ответы:
Использование встроенной версии PHPUnit, даже если она древняя, вероятно, является наилучшим способом, поскольку это позволит запускать тесты для всех модулей вместе во время CI.
Я думаю, что написание тестов способом, несовместимым с интегрированной средой тестирования, значительно снижает ценность тестов.
Конечно, вы можете настроить CI для запуска ваших тестов с другой версией PHPUnit, но это значительно усложняет систему сборки.
Тем не менее, я согласен с вами, что не стоит поддерживать PHP 5.6. Я использую подсказки скалярного типа PHP7 и подсказки возвращаемого типа в максимально возможной степени (плюс, мне нет дела до рынка).
Чтобы обойти ограничения насмешливой библиотеки PHPUnit 4.1, есть по крайней мере два довольно простых обходных пути, которые я использовал в прошлом:
Используйте анонимные или обычные классы для создания ваших двойников теста, например
Используйте прилагаемый PHPUnit, но стороннюю библиотеку-макет, которая может быть включена через composer
require-dev
, например, https://github.com/padraic/mockery . Все пробные библиотеки, которые я пробовал, очень легко можно использовать с любой средой тестирования, даже с очень старой версией PHPUnit, такой как 4.1.Ни один из них не имеет каких-либо технических преимуществ перед другим. Вы можете реализовать любой необходимый тест двойной логики с любым из них.
Лично я предпочитаю использовать анонимные классы, потому что это не увеличивает количество внешних зависимостей, а также гораздо веселее писать их таким образом.
РЕДАКТИРОВАТЬ :
Чтобы ответить на ваши вопросы:
Да, см. Пример ниже.
Использование анонимных классов для создания тестовых двойников также является «насмешливым», на самом деле оно ничем не отличается от использования насмешливой библиотеки, такой как PHPUnits или Mockery, или другой.
Макет только на конкретный тип двойного теста , независимо от того, как он создается.
Небольшое различие между использованием анонимных классов или фиктивной библиотеки состоит в том, что анонимные классы не имеют зависимости от внешней библиотеки, поскольку это просто PHP. В противном случае нет никаких преимуществ или недостатков. Это просто вопрос предпочтений. Мне это нравится, потому что оно иллюстрирует, что тестирование не связано с какой-либо инфраструктурой тестирования или фиктивной библиотекой, тестирование - это просто написание кода, который выполняет тестируемую систему и автоматически проверяет ее работоспособность.
Это может быть проблематично, поскольку тесты в других модулях и ядре тестируются только с помощью PHPUnit 4.1, и в этом случае вы можете столкнуться с ложными сбоями в CI. Я думаю, что по этой причине лучше придерживаться связанной версии PHPUnit. @maksek сказал, что они будут обновлять PHPUnit, но ETA для этого не существует.
Пример теста с двойным тестом класса, для которого требуется PHP7, работающий с PHPUnit 4.1, с использованием библиотеки Mockery:
источник
composer.json
файле до 5.3.5 (последняя версия, поддерживающая PHP7 и имеющая публичные методы mocking (требуется для собственных тестов Magento 2))? Так много вопросов сейчас ...Сейчас Magento 2 поддерживает следующие версии PHP:
Это означает, что весь код, написанный командой Magento, работает на каждой поддерживаемой версии.
Следовательно, Magento Team не использует только PHP 7. Возможности PHP 5.6 могут быть покрыты PHPUnit 4.1.0.
При написании собственного кода вы можете делать все, что хотите, и писать тесты любым удобным для вас способом. Но я считаю, что вы не сможете опубликовать свое расширение на Magento Marketplace из-за нарушения требований.
источник