I "inherited" a very old PHP project compatible only with PHP 5.6 and written without any framework, and I'm trying to "modernize" it for PHP 7.x and adding some unit tests and some code inspection tools like SonarQube with Jenkins.
The project has some executable scripts which needs some arguments to be executed correctly and when I execute phpunit with the generation of the Clover coverage enabled it tries to execute them and they fail because required arguments are missing:
⋊> ~/P/myproject on mybranch ⨯ ./phpunit tests/
PHPUnit 5.7.27 by Sebastian Bergmann and contributors.
Runtime: PHP 7.4.5 with Xdebug 2.9.5
Configuration: /Users/me/Projects/myproject/phpunit.xml
You must specify a source (--source)!
This is the output of the files-index.php command from the root folder of the project which need a --source parameter to run:
[...]
if (!$args['source']) {
exit("You must specify a source (--source)!\n");
}
[...]
What I don't understand is why if I execute PHPUnit without coverage report enabled the (few) tests present into the project are executed with no error (anyway the file files-index.php has no tests at the moment):
⋊> ~/P/myproject on mybranch ⨯ ./phpunit --no-config tests/
PHPUnit 5.7.27 by Sebastian Bergmann and contributors.
........ 8 / 8 (100%)
Time: 194 ms, Memory: 4.00MB
OK (8 tests, 8 assertions)
This is my phpunit.xml file:
⋊> ~/P/myproject on mybranch ⨯ cat phpunit.xml 22:10:25
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="phpunit.xsd"
backupGlobals="false"
verbose="true">
<testsuites>
<testsuite name="My Project">
<directory>./tests</directory>
</testsuite>
</testsuites>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">.</directory>
<exclude>
<directory suffix=".php">./vendor</directory>
<directory suffix=".php">./_classes</directory>
</exclude>
</whitelist>
</filter>
<logging>
<log type="junit" target="./reports/logfile.xml"/>
<log type="coverage-clover" target="./reports/coverage.xml"/>
</logging>
<php>
<const name="PHPUNIT_TESTSUITE" value="true"/>
</php>
</phpunit>
Where I'm wrong?
exitis much of a bummer in php (unit) (tests) as it exists the runtime. keep files using it out of tests (and likewise consider to put them into test withoutexitin them, not totally nice but one way I know of is to use exceptions to signal exit state, your mileage may vary). not so sure about phpunit code-coverage here as I do not expect it to include white-listed file (so perhaps more an issue in your code-base) however better than "." to whitelist is to explicitly exclude the file the error message comes from it.