phpunit --path-coverage(分支覆盖)花费 100 倍以上的时间

标签 phpunit code-coverage xdebug

我有一个包含大量测试的 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 倍是否正常?

最佳答案

TLDR:是的,这是预期的。

Xdebug 需要做很多工作才能确定此信息。

  1. 它需要更详细地分析存在哪些路径和分支,并存储这些信息。即使没有打开路径覆盖,Xdebug 也会进行一些分析以找到死代码——这就是它比 pcov 慢的原因,而 pcov 也没有这样做。
  2. Xdebug 需要重载每条内部 PHP 指令(操作码),以便它可以确定它是新分支的开始,如果是,则记录该信息。
  3. Xdebug 需要收集在函数执行期间看到的所有分支,并对其进行整理以找出看到的路径,并存储该信息。

所有这些检查以及额外的数据存储都会大大降低性能。但这并不是因为 Xdebug 很慢,而是因为它做了很多工作。

如果可以只为特定的高影响函数和方法启用路径/分支覆盖,那就太好了,但我认为 PHPUnit 还没有办法做到这一点。

关于phpunit --path-coverage(分支覆盖)花费 100 倍以上的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69188975/

相关文章:

c# - 从 Visual Studio 2015 中的代码覆盖率中排除自动属性

python - 将命令行生成的 python .coverage 文件与 PyDev 集成

python - 使用变量设置日志记录级别

php - 在 Xdebug 中中断属性更改

php - Selenium:如何从选择菜单中选择一个选项?

php - 有没有办法让 PHPUnit 确定 @method 声明的代码覆盖率?

testing - mock 无法计算 Facade 上的方法调用

code-coverage - xcode 4.5 的代码覆盖率 - 未生成 gcda

PhpStorm 未接收 xdebug 连接 : PhpStorm event log : Cannot evaluate expression 'isset($_SERVER[' PHP_IDE_CONFIG'])'

phpunit 3.7 : what happened to the @assert annotation?