phpunit --path-coverage(分支覆盖)需要 100 倍以上的时间
Posted
技术标签:
【中文标题】phpunit --path-coverage(分支覆盖)需要 100 倍以上的时间【英文标题】:phpunit --path-coverage (branch coverage) takes 100x more time 【发布时间】:2021-11-10 07:09:40 【问题描述】:我有一个包含大量测试的 Laravel 项目。我正在使用 pcov 计算代码覆盖率,大约需要 4 分钟。但是 pcov 不支持分支覆盖,所以我决定使用 xdebug 。
使用 xdebug 测试执行,有代码覆盖但没有 --path-coverage(分支覆盖)大约需要 8 分钟。
但是使用 xdebug、代码覆盖和 --path-coverage(分支覆盖)测试执行需要超过 2 个小时,甚至不能等到结束:
INFO[2021-09-14 21:33:24] Executing runtests with coverage xdebug
XDEBUG_MODE=coverage
php artisan test --parallel --processes=8 --verbose --passthru=--path-coverage tests/Feature --coverage-text
Warming cache for static analysis ... done [00:00.071]
............S................................................ 61 / 1180 ( 5%)
............................................................. 122 / 1180 ( 10%)
............................................................. 183 / 1180 ( 15%)
............................................................. 244 / 1180 ( 20%)
.......
INFO[2021-09-15 00:00:05] finished in 2h 26m 40.458565176s
所以我的问题是 --path-coverage 需要超过 100 倍的执行时间是否正常?
【问题讨论】:
【参考方案1】:TLDR:是的,这是意料之中的。
Xdebug 需要做很多 工作才能确定此信息。
-
需要更详细地分析存在哪些路径和分支,并存储这些信息。即使没有打开路径覆盖,Xdebug 也会进行一些分析以找到死代码——这就是它比 pcov 慢的原因,而 pcov 也不这样做。
Xdebug 需要重载每个内部 PHP 指令(操作码),以便它可以确定它是新分支的开始,如果是,则记录该信息。
Xdebug 需要收集在函数执行期间看到的所有分支,并对其进行整理,以便找出看到的路径,并存储该信息。
所有这些检查以及额外的数据存储都会大大降低性能。但这并不是因为 Xdebug 很慢,而是因为它做了很多工作。
如果可以只为特定的高影响函数和方法启用路径/分支覆盖,那就太好了,但我认为 PHPUnit (目前)还没有办法。
【讨论】:
@sebastian-bergman 和 Derick 感谢您的回答,我非常感谢您为 phpunit 和 xdebug 添加分支覆盖率所做的努力!推动 PHP 向前发展非常重要。很遗憾,由于时间执行限制,我无法在我的项目中使用它。也许在未来的某个时候:-)【参考方案2】:是的,这是意料之中的正常现象。
【讨论】:
以上是关于phpunit --path-coverage(分支覆盖)需要 100 倍以上的时间的主要内容,如果未能解决你的问题,请参考以下文章
phpunit 抛出未捕获的异常'PHPUnit_Framework_Exception
markdown [代码覆盖率Phpunit]安装Xdebug并使用Phpunit运行代码覆盖率#xdebug #phpunit #code #coverage