首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何多次运行php单元并连接覆盖率报告?

如何多次运行php单元并连接覆盖率报告?
EN

Stack Overflow用户
提问于 2015-03-13 18:21:11
回答 2查看 3.5K关注 0票数 10

我的测试代码充满了最终的静态类。虽然我们不能为更好的测试重构它,但我有一个中间解决方案,它在它自己的进程上运行几个小测试。一切都很好。但我没有得到报道,因为一个覆盖另一个。

我目前正在用三叶草制作这份报告,但我对其他报告非常开放。

我的测试只在phpunit以下列方式运行时才能工作:

代码语言:javascript
复制
/home/y/bin/phpunit --coverage-html clover --coverage-clover clover/report.xml --include-path src/  tests/aTest.php
OK (1 test, 1 assertions)
/home/y/bin/phpunit --coverage-html clover --coverage-clover clover/report.xml --include-path src/  tests/bTest.php
OK (1 test, 1 assertions)
/home/y/bin/phpunit --coverage-html clover --coverage-clover clover/report.xml --include-path src/  tests/cTest.php
OK (1 test, 1 assertions)

但这将导致每次运行都会从前一次报告中删除。所以我只得到了最后一份报告。如果我试图像phpunit期望生成完整的报告那样运行它们,我就会失败,因为我的所有类都包含它们自己的静态报告。

代码语言:javascript
复制
/home/y/bin/phpunit --coverage-html clover --coverage-clover clover/report.xml --include-path src/  tests/
. (first test pass)
PHP Fatal error:  Cannot redeclare class Something
make[1]: *** [phpunit_run] Error 255

(但即使使用--process-isolation --no-globals-backup,上面的内容也会失败,因为这并不是它们的确切含义)-这并不是关于如何在php单元上获得正确的进程隔离的又一个问题。我很好运行了几次,我只想要一份完整的报道:)

是否有任何方法可以让测试正确运行(例如,在几个进程中避免受污染的全局类声明空间),比如第一个代码块,但仍然有全面的代码覆盖报告?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-17 17:37:08

Schleis的回答对我没有用。反序列化()方法在我的例子中抛出一个错误:在偏移量处的错误.

然而,要实现这一点,有一个非常简单的方法:

下载描述为这里的phpcov。

让phpunit用以下方式生成php覆盖率报告:

代码语言:javascript
复制
phpunit --coverage-php coverage/cov/foo.cov tests/foo
phpunit --coverage-php coverage/cov/bar.cov tests/bar

现在您有两个.cov文件。然后在你最喜欢的贝壳里:

代码语言:javascript
复制
phpcov merge --clover clover.xml /coverage/cov

它将生成一个clover.xml报告文件。

票数 13
EN

Stack Overflow用户

发布于 2015-03-18 13:40:51

您将不得不脚本解决方案,我不知道有一个选项,让phpunit一起添加覆盖从其他运行。但是phpunit代码使这并不太痛苦。

您将希望使用--coverage-php选项来获取覆盖率报告。这将使使用php脚本组合它们更加容易。此选项输出带有序列化PHP_CodeCoverage对象的文件。此对象具有可用于组合报表的方法merge。然后,可以使用适当类型的report对象为您生成输出。

https://github.com/sebastianbergmann/php-code-coverage/tree/master/src/CodeCoverage/Report

由于现在用于分发PHPUnit的.phar文件,我在包含PHPUnit对象方面确实遇到了问题。您可能想研究如何使用这个用于您自己的自动包含的.gist。

您的脚本应该如下所示:

代码语言:javascript
复制
$fileList = ['file1', 'file2', 'file3']; //or read from dir, however you get the list.
$coverageReports = [];
foreach($fileList as $file) {
    $coverageReports[] = unserialize(file_get_contents($file));
}

$mainReport = new PHP_CodeCoverage(); //Could also use one of the other ones that were generated.

foreach($coverageReports as $coverageReport) {
    $mainReport->merge($coverageReport);
}

//Change this object depending on the format you want.
$htmlReport = new PHP_CodeCoverage_Report_HTML();  

$htmlReport->process($mainReport);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29039343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档