UnitTest в Magento 2

Модульное тестирование в Magento 2

Модульные тесты или Юнит тесты или Unit tests предназначены для тестирования отдельных методов класса изолированно, перебирая все возможные комбинации и заботясь о наименьшей тестируемой части приложения. Magento 2 использует инфраструктуру тестирования PHPUnit для своих модульных тестов. Будучи сфокусированными на очень небольшом куске кода класса, модульные тесты позволяют легко определить причину проблем в случае сбоя определенного теста. Мы можем специально запустить только юнит-тесты из корня установки Magento, используя следующую команду:

bin/magento dev:tests:run unit

После запуска Magento выполнит команду execute в файле

vendor/magento/module-developer/Console/Command/DevTestsRunCommand.php

Поскольку тип устройства сопоставлен с несколькими командами, Magento 2 будет запускать тесты на основе настроек из следующих каталогов, по-очереди, как показано ниже:

dev/tests/unit
dev/tests/performance/framework/tests/unit
dev/tests/static/framework/tests/unit
dev/tests/integration/framework/tests/unit

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

Внутри каждого из этих каталогов Magento внутренне запускает метод passthru($command, $returnVal), где параметр $command преобразуется в строку, подобную следующей:

php /www/magento2/./vendor/phpunit/phpunit/phpunit

Затем PHPUnit будет искать файл конфигурации phpunit.xml в каждом из этих каталогов, если такого не будет найдено, то будут использованы настройки из файла phpunit.xml.dist. Нам лучше самим создать файл phpunit.xml самостоятельно, если он не существует, просто скопировав и переименовав файл phpunit.xml.dist - это поможет нам четко понимать, где наши индвидуальные настройки.

Ниже представлен список путей, в которых будет осуществлен поиск файлов тестов, у которых в обязательном порядке должно быть окончание "Test.php". Вот пример названия тестового файла "SomePluginTest.php".

../../app/code/*/*/Test/Unit
../../dev/tools/*/*/Test/Unit
../../dev/tools/*/*/*/Test/Unit
../../lib/internal/*/*/Test/Unit
../../lib/internal/*/*/*/Test/Unit
../../setup/src/*/*/Test/Unit
../../update/app/code/*/*/Test/Unit
../../vendor/*/module-*/Test/Unit
../../vendor/*/framework/Test/Unit
../../vendor/*/framework/*/Test/Unit

Например, если мы посмотрим на первую строку в предыдущем коде, а затем посмотрим на модуль Magento_Catalog, становится ясно, что тестовые файлы находятся в папке app/code/<vendorName>/<moduleName>/Test/ каталог и его подкаталоги. Все файлы с суффиксом Test.php в этих папках будут выполнены как часть модульного теста.

Настройки из файла phpunit.xml позволяют гибко настраивать группу запускаемых тестов

Если бы мы создавали наш собственный модуль, мы могли бы легко сделать копию dev/tests/unit/phpunit.xml.dist, правильно отредактировать testsuite и filter > whitelist, чтобы быстро выполнить модульные тесты только нашего модуля или нашего вендора, тем самым сэкономив некоторое время на избежании частых выполнений всех модульных тестов Magento 2.

Запуск Unit Test для отдельного модуля или вендора в Magento 2

Это очень удобно, запускать модульные тесты в узком диапазоне тестирования: для отдельного модуля или для отдельного вендора. Таким образом вы сможете резко увеличить скорость прохождения разрабатываемого вами unit-теста. Настройки для "натравливания" тестов на определенное место в вашем проекте крайне просты: отредактировать надо буквально два файла. В одном из них мы определим место где будут выполнятся файлы тестов, а в другом - какие модульные тесты будут выполнятся: unit, unit-static или unit-integration. Итак, приступим.

Диапазон тестируемых файлов тестов

Первое, что мы сделаем - определим тестируемый диапазон и закомментируем мешающие нам настройки. Делать мы это будем в файле

dev/tests/unit/phpunit.xml

Такого файла может не быть, но обязательно будет файл

dev/tests/unit/phpunit.xml.dist

Нам лучше создать файл phpunit.xml, скопировав и переименовав phpunit.xml.dist. Таким образом мы сохраним оригинальные настройки и получим возможность оперировать своими. Настраивать мы будем testsuite вот в этом месте:

<testsuite name="Magento_Unit_Tests_App_Code">
   <directory suffix="Test.php">../../../app/code/*/*/Test/Unit</directory>
</testsuite>

В ноде directory указан шаблон пути, по которому будут искаться файлы тестов для выполнения. Соответственно, если мы хотим тестировать все модули отдельного вендора, то данный путь надо преобразовать к виду

../../../app/code/VENDOR/*/Test/Unit

Если же мы желаем работать исключительно с одним модулем, то отредактировать шаблон пути мы должны вот так

../../../app/code/VENDOR/MODULE/Test/Unit

Кроме этого, нам необходимо закомментировать некоторые строки в этом же файле. Ниже приведен список узлов, которые должы быть подвергнуты данной процедуре.

<testsuite name="Magento_Unit_Tests_Other">
    <!-- some commented strings -->
</testsuite>
<filter>
    <!-- some commented strings -->
</filter>
<listeners>
    <!-- some commented strings -->
</listeners>
<logging>
    <!-- some commented strings -->
</logging>

В принципе, этим можно и ограничится, но в таком случае будут запускаться три вида юнит-тестов:

  1. unit,
  2. unit-static,
  3. unit-integration

Нас интересует только "чистый" unit, поэтому нам придется выполнить следующий, втрой, шаг.

Диапазон запускаемых unit тестов

Магия этой хитрости находится в файле vendor/magento/module-developer/Console/Command/DevTestsRunCommand.php на строке 147

vendor/magento/module-developer/Console/Command/DevTestsRunCommand.php:147

Мы должны привести эту строку кода к такому виду

'unit' => ['unit', /*'unit-static', 'unit-integration'*/],

То есть, мы комментируем unit-static и unit-integration тесты.

Вот и все. Теперь наши тесты можно запускать простой командой из корня проекта

bin/magento dev:tests:run unit

и не боятся, что проверка работоспособности тестов нашего вендора/модуля приведет к выполнению всех коробочных модулей из директории vendor, что неминуемо приведет к фейлам при их запуске.

magento, vue, elasticsearch, yii2, git, javascript, jquery, mysql, php, redis, phpstorm, bootstrap, bash, go, postman, css, юнит, тесты, magento2, unit, test, magento, web, development, разработка, hint, stack, стек, подсказки