У меня есть небольшая проблема после рефакторинга моего приложения Laravel, чтобы оно было модульным при выполнении отчета о покрытии PHPUnit.
Это моя структура каталогов после рефакторинга:
laravel-project/
├── app/
│ ├── Exception
│ ├── Providers
│ └── ...
├── modules/
│ ├── ModuleA/
│ │ ├── Services
│ │ ├── Http/
│ │ │ ├── Controllers
│ │ │ └── Requests
│ │ └── Models
│ └── ModuleB/
│ └── ...
├── tests
└── ...
Это моя конфигурация phpunit xml
<?xml version = "1.0" encoding = "UTF-8"?>
<phpunit
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation = "./vendor/phpunit/phpunit/phpunit.xsd"
bootstrap = "vendor/autoload.php"
colors = "true">
<testsuites>
<testsuite name = "Unit">
<directory suffix = "Test.php">./tests/Unit</directory>
</testsuite>
<testsuite name = "Feature">
<directory suffix = "Test.php">./tests/Feature</directory>
</testsuite>
</testsuites>
<coverage processUncoveredFiles = "true">
<include>
<directory suffix = ".php">./app</directory>
<directory suffix = ".php">./modules</directory>
</include>
<exclude>
<directory suffix = ".php">./modules/*/database</directory>
</exclude>
</coverage>
<php>
<env name = "APP_ENV" value = "testing"/>
<env name = "APP_URL" value = "https://nginx"/>
<env name = "DB_CONNECTION" value = "sqlite"/>
<env name = "DB_DATABASE" value = "/var/www/html/database/database.sqlite"/>
<env name = "CACHE_DRIVER" value = "redis"/>
<env name = "MAIL_MAILER" value = "array"/>
<env name = "QUEUE_CONNECTION" value = "redis"/>
<env name = "SESSION_DRIVER" value = "array"/>
<env name = "TELESCOPE_ENABLED" value = "false"/>
</php>
</phpunit>
Проблема возникает, когда я пытаюсь выполнить команду отчета о покрытии phpunit phpunit test --coverage
, где на выходе нет папки с модулями:
Когда я пытаюсь удалить параметры processUncoveredFiles = "true"
в фильтре покрытия, он показывает покрытие модулей, НО каждый тест, который я создал (даже несмотря на то, что он вызывает методы внутри папки модулей), по-прежнему не увеличивает процент покрытия модулей. отчет о покрытии.
Кто-нибудь сталкивался с этой проблемой раньше при попытке включить покрытие/тесты, отличные от приложения/папки Laravel?
Как включить папку вне приложения / в отчет о покрытии Phpunit, например. Модули или папка базы данных, которая имеет тот же уровень каталога, что и приложение/папка?
Это зависит от версии PHPUnit (иногда даже версии Laravel).
Вот что работает для меня:
<filter>
<whitelist processUncoveredFilesFromWhitelist = "true">
<directory suffix = ".php">./app</directory>
<directory suffix = ".php">./modules</directory>
<exclude>
<directory suffix = ".php">./modules/**/database</directory>
</exclude>
</whitelist>
</filter>
Попробуйте выше вместо тега <coverage ...>
, я имею в виду, удалите свой:
<coverage processUncoveredFiles = "true">
<include>
<directory suffix = ".php">./app</directory>
<directory suffix = ".php">./modules</directory>
</include>
<exclude>
<directory suffix = ".php">./modules/*/database</directory>
</exclude>
</coverage>
Чтобы команда выполнялась из нужной папки, без cd
необходимости, создайте test-coverage
composer-script, например:
{
// ...
"scripts": {
"test-coverage": [
"Composer\\Config::disableProcessTimeout",
"@php -d xdebug.mode=coverage vendor/phpunit/phpunit/phpunit --coverage-html ./.build/coverage --verbose"
]
}
}
И выполнять его всякий раз, когда это необходимо, например:
composer run test-coverage
Наконец, смотрите результат в файле ./.build/coverage/index.html
.
Обратите внимание, что я предпочитаю отчет в формате HTML, и для этого я добавил свою папку
.build
в.gitignore
, но вы можете изменить команду выше.Кроме того, для Composer старше
1.9
удалите строку"Composer\\Config::disableProcessTimeout",
и вместо этого попробуйте что-то вроде:{ "config": { "process-timeout": 0 }, }
@AzvyaErstevanI Файл Laravel phpunit.xml
находится в корневой папке проекта (которая является родителем папки app
), поэтому ваша ссылка не связана с вашей проблемой, если только вы вручную cd
не попадаете в неправильный каталог каждый раз, когда запускаете PHPUnit ???
Плохо, я только что узнал, что, поскольку я установил pcov и xdebug одновременно с помощью расширений docker php, оба включены, и, как мы знаем, Pcov плохо работал с xdebug. Единственное, что я должен был сделать, это просто использовать pcov или xdebug для отчета о покрытии, но спасибо за обходной путь.
Из этого предоставленного ответа PHPUnit x Symfony: покрытие 0% за пределами каталога src похоже, что phpunit может запускать код только в каталоге, где выполняется тестовый запуск. Тем не менее, я не могу заставить это работать, что я задумал