Laravel: включить папки в отчет о покрытии PHPUnit (если они находятся вне приложения/папки)?

У меня есть небольшая проблема после рефакторинга моего приложения 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, например. Модули или папка базы данных, которая имеет тот же уровень каталога, что и приложение/папка?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
2
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это зависит от версии 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
   },
}

Из этого предоставленного ответа PHPUnit x Symfony: покрытие 0% за пределами каталога src похоже, что phpunit может запускать код только в каталоге, где выполняется тестовый запуск. Тем не менее, я не могу заставить это работать, что я задумал

Azvya Erstevan 13.02.2023 08:44

@AzvyaErstevanI Файл Laravel phpunit.xml находится в корневой папке проекта (которая является родителем папки app), поэтому ваша ссылка не связана с вашей проблемой, если только вы вручную cd не попадаете в неправильный каталог каждый раз, когда запускаете PHPUnit ???

Your Common Sense 13.02.2023 10:22

Плохо, я только что узнал, что, поскольку я установил pcov и xdebug одновременно с помощью расширений docker php, оба включены, и, как мы знаем, Pcov плохо работал с xdebug. Единственное, что я должен был сделать, это просто использовать pcov или xdebug для отчета о покрытии, но спасибо за обходной путь.

Azvya Erstevan 13.02.2023 11:04

Другие вопросы по теме