PHPUnit实际上标记了一个未经测试的类(0%覆盖率)

时间:2017-01-25 13:30:39

标签: php phpunit code-coverage

PHPUnit正在标记一些不具备测试覆盖率的类作为" n / a"但结果是代码覆盖百分比被夸大了,因为它们的行不被计算。

这些课程被揭开,所以我希望他们这样对待。

我如何实现这一目标?

PHPUnit配置:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="tests/bootstrap.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="true">
    <testsuites>
        <testsuite name="Application Test Suite">
            <directory suffix="Test.php">./tests</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./src</directory>
        </whitelist>
    </filter>
    <logging>
        <log type="coverage-html"
             target="./tests/log/report"
             charset="UTF-8"
             yui="true"
             hightlight="true"
             lowupperbound="50"
             highlowerbound="80" />
    </logging>
</phpunit>

输出:

enter image description here

EventApi类有3个方法和40行。

2 个答案:

答案 0 :(得分:0)

不确定,但您可以尝试使用过滤器吗?

   <whitelist>
            <directory>./src</directory>
        </whitelist>

Phpunit coverage: what is the difference between 'addUncoveredFilesFromWhitelist' and 'processUncoveredFilesFromWhitelist' options?

答案 1 :(得分:-1)

PHP_CodeCoverage基于xdebug / phpdbg,它只能跟踪实际执行的代码行,并且他们不知道导致执行的测试用例。如果这个类在另一个测试中使用而你没有模仿它们,那么PHPUnit认为它们被覆盖了。如果这个类在另一个测试中使用而你没有模仿它们,那么PHPUnit认为它们被覆盖了。

来自manual

  

PHP_CodeCoverage仅考虑覆盖其所有可执行行时所涵盖的函数或方法。   PHP_CodeCoverage只考虑涵盖其所有方法时所涵盖的类或特征。

因此,即使没有对课程进行任何直接测试,也可能将其标记为已覆盖。如果您只需要测试一个类而不影响其他代码,那么您需要相互模拟。但是在使用静态方法,全局函数等时可能很难。

此外,您可以使用@cover

  

指定涵盖方法

     

可以在测试代码中使用@covers注释(参见表B.1)来指定测试方法要测试的方法。如果提供,则仅考虑指定方法的代码覆盖率信息。