【发布时间】:2017-02-22 04:27:44
【问题描述】:
我可以从代码覆盖范围中排除“require_once”语句吗?带有“require_once”的行被报告为未覆盖,但如果脚本中的其他行被覆盖,则不可能:
PHP 7.0.11、PHPUnit 5.5.7 和 XDebug 2.4.0 用于代码覆盖。
【问题讨论】:
标签: php phpunit code-coverage xdebug
我可以从代码覆盖范围中排除“require_once”语句吗?带有“require_once”的行被报告为未覆盖,但如果脚本中的其他行被覆盖,则不可能:
PHP 7.0.11、PHPUnit 5.5.7 和 XDebug 2.4.0 用于代码覆盖。
【问题讨论】:
标签: php phpunit code-coverage xdebug
在PHPUnit documentation 中提到使用@codeCoverageIgnoreStart / @codeCoverageIgnoreEnd / @codeCoverageIgnore cmets 将代码块排除在覆盖范围之外。
所以你可以试试这样的:
// @codeCoverageIgnoreStart
require_once __DIR__ . '/Data/TData.php';
require_once __DIR__ . '/Data/Path.php';
// @codeCoverageIgnoreEnd
或
require_once __DIR__ . '/Data/TData.php'; // @codeCoverageIgnore
require_once __DIR__ . '/Data/Path.php'; // @codeCoverageIgnore
【讨论】:
forceCoversAnnotation只有使用the section called "
@covers" 中记录的@covers注释的测试才会记录代码覆盖率。
禁用forceCoversAnnotation 将覆盖require_once 调用。
例如,您可以在phpunit.xml 配置文件中禁用forceCoversAnnotation:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit forceCoversAnnotation="false">
...
如果您想使用@covers 注释,那么您需要禁用checkForUnintentionallyCoveredCode 或将require_once 调用包装在@codeCoverageIgnore* 注释中。
要么
<?xml version="1.0" encoding="UTF-8"?>
<phpunit forceCoversAnnotation="true"
checkForUnintentionallyCoveredCode="false">
...
或者
// @codeCoverageIgnoreStart
require_once __DIR__ . '/Data/TData.php';
require_once __DIR__ . '/Data/Path.php';
// @codeCoverageIgnoreEnd
原因是,使用forceCoversAnnotation 意味着您要明确指定所有内容。您可以使用@covers 注释来做到这一点。 @uses 注释让您指定测试有意覆盖的代码。但是@uses 不能用于指定导致副作用的代码,例如require_once 声明。这就是@codeCoverageIgnoreStart 和@codeCoverageIgnoreEnd 的用武之地,它允许您明确指定覆盖率应忽略的代码。
这些注释大多是关于代码覆盖的严格性。
【讨论】: