如何在测试代码时完全覆盖条件(例如 PHP 和 xdebug)
How to fully cover conditionals while testing code (eg. PHP and xdebug)
前段时间我开始用 PHPUnit (v. 9) 编写测试。它很棒而且令人惊奇但是:
我怎样才能正确地覆盖条件?
我将给出一些结果正确且符合预期的示例,以及我发现问题的示例。这是:
Please note that code below is only the sample.
I know that when I pass true
to if
statement there will be no chance to go to other branch of code. It's only the example as plain as possible.
问题不存在的情况:
if (true) {
return 'true';//here is covered
}
return 'false';//here is not covered
没关系,但是下面是:
return (true) ? 'true' : 'false';
整行被视为被覆盖,但很明显永远不会返回 false。
所以。我做错了什么?
唯一的解决办法是不使用三元运算符?它的语法非常短,但由于缺少有关覆盖率的(真实/虚假)信息而容易出错。 :(
PHP 单元中的默认视图确实是行覆盖,因此,正如您所指出的,在单行三元情况下无法区分两个分支。
不过最近PHP单位还有branch and path coverage.
它显示在“Lines”左侧的输出中。为了查看缺少哪些分支,您可以将鼠标悬停在源视图中的黄色线上,它会告诉您(在我的示例中)仅遵循了 4 条可能路径中的 3 条。
此功能的作者还写了一篇extensive explanation on his blog。
前段时间我开始用 PHPUnit (v. 9) 编写测试。它很棒而且令人惊奇但是:
我怎样才能正确地覆盖条件?
我将给出一些结果正确且符合预期的示例,以及我发现问题的示例。这是:
Please note that code below is only the sample.
I know that when I pass
true
toif
statement there will be no chance to go to other branch of code. It's only the example as plain as possible.
问题不存在的情况:
if (true) {
return 'true';//here is covered
}
return 'false';//here is not covered
没关系,但是下面是:
return (true) ? 'true' : 'false';
整行被视为被覆盖,但很明显永远不会返回 false。
所以。我做错了什么?
唯一的解决办法是不使用三元运算符?它的语法非常短,但由于缺少有关覆盖率的(真实/虚假)信息而容易出错。 :(
PHP 单元中的默认视图确实是行覆盖,因此,正如您所指出的,在单行三元情况下无法区分两个分支。
不过最近PHP单位还有branch and path coverage.
它显示在“Lines”左侧的输出中。为了查看缺少哪些分支,您可以将鼠标悬停在源视图中的黄色线上,它会告诉您(在我的示例中)仅遵循了 4 条可能路径中的 3 条。
此功能的作者还写了一篇extensive explanation on his blog。