PHP_CodeCoverage 1.1删除了PHP_CodeCoverage_Filter
的单例访问者,允许我们的PHPUnit bootstrap.php
文件将目录添加到白名单/黑名单中。 PHPUnit 3.5使用黑名单从异常堆栈跟踪中剥离类,CC使用白名单来限制跟踪。我们使用了这两个功能。
如何从PHP_CodeCoverage_Filter
文件中获取PHPUnit将使用的bootstrap.php
实例?
注意:我们无法将这些内容放入phpunit.xml
,因为路径是根据环境变量和配置文件构建的。
更新:我发现PHPUnit_Util_Filter
不再使用代码覆盖黑名单来过滤堆栈跟踪。这很好,因为这个类是为静态访问而设计的,所以我可以添加一个方法来将用户目录添加到列表中。这将是一个简单的改变,并解决了这个问题的一半。
答案 0 :(得分:2)
这是一个丑陋的黑客,但它适用于PHPUnit 3.6。我们已经有了自己的自定义测试用例基类,所有其他基类都扩展了。如果将文件添加到白名单中并不重要,您可以使用假测试用例来处理此部分。
首先,bootstrap.php
根据需要多次调用BaseTestCase :: addXXXToCodeCoverageWhitelist()来填充稍后要添加的内部文件数组。接下来,要执行的第一个测试通过TestResult
将这些文件添加到代码覆盖率过滤器。
abstract class BaseTestCase extends PHPUnit_Framework_TestCase
{
private static $_codeCoverageFiles = array();
public static function addDirectoryToCodeCoverageWhitelist($path) {
self::addFilesToCodeCoverageWhitelist(self::getFilesForDirectory($path));
}
public static function addFileToCodeCoverageWhitelist($path) {
self::addFilesToCodeCoverageWhitelist(array($path));
}
public static function addFilesToCodeCoverageWhitelist(array $paths) {
self::$_codeCoverageFiles = array_merge(self::$_codeCoverageFiles, $paths);
}
public static function getFilesForDirectory($path) {
$facade = new File_Iterator_Facade;
return $facade->getFilesAsArray($path, '.php');
}
private static function setCodeCoverageWhitelist(PHP_CodeCoverage $coverage = null) {
if ($coverage && self::$_codeCoverageFiles) {
$coverage->setProcessUncoveredFilesFromWhitelist(true); // pick your poison
$coverage->filter()->addFilesToWhitelist(self::$_codeCoverageFiles);
self::$_codeCoverageFiles = array();
}
}
public function runBare() {
self::setCodeCoverageWhitelist($this->getTestResultObject()->getCodeCoverage());
parent::runBare();
}
}
更新:对于那些使用黑名单来保持框架类不像我们那样出现在断言失败堆栈跟踪中的人,将以下方法添加到上面的类中并从{{1 }}。这需要PHP 5.3中的bootstrap.php
。
setAccessible()
答案 1 :(得分:1)
我已向Sebastian询问过这个问题,并且他确认无法以编程方式使用PHPUnit 3.6访问CodeCoverage_Filter。
我的建议是通过使用模板动态创建phpunit.xml,然后在填写配置文件后填写添加所需的<directory>
节点。
也许有一种方法可以通过在将来继承测试运行器来注入PHP_CodeCoverage [_Filter]对象。