如何在测试代码时完全覆盖条件(例如 PHP 和 xdebug)

Mar*_* G. 1 php phpunit code-coverage xdebug

不久前,我开始在 PHPUnit (v. 9) 中编写测试。这很棒而且令人惊奇,但是:

如何正确涵盖条件语句?

我将给出一些例子,其中结果是正确的和预期的,以及我发现问题的地方。这里是:

请注意,下面的代码只是示例。

我知道当我传递true到if语句时,将没有机会转到代码的其他分支。这只是尽可能简单的示例。

问题不存在的情况:

if (true) {
    return 'true';//here is covered
}
return 'false';//here is not covered    
Run Code Online (Sandbox Code Playgroud)

这没关系,但是如下:

return (true) ? 'true' : 'false';
Run Code Online (Sandbox Code Playgroud)

整行被视为覆盖,但显然 false 永远不会返回。

所以。我做什么坏事了?

唯一的解决方案是不使用三元运算符?它的语法非常短,但由于缺乏有关覆盖率的(真实/错误)信息而容易出错。:(

Der*_*ick 5

PHP Unit 中的默认视图确实是行覆盖率,因此,正如您所指出的,无法区分单行三元情况下的两个分支。

然而,最近 PHPUnit 还具有分支和路径覆盖。PHP 单元输出

它在“Lines”的输出左侧显示了这一点。为了查看缺少哪些分支,您可以将鼠标悬停在源视图中的黄色行上,它会告诉您(在我的示例中)仅遵循了 4 个可能路径中的 3 个。

分支视图

该功能的作者还在他的博客上写了详细的解释。