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

Posted

技术标签:

【中文标题】如何在测试代码时完全覆盖条件(例如 PHP 和 xdebug)【英文标题】:How to fully cover conditionals while testing code (eg. PHP and xdebug) 【发布时间】:2021-08-09 12:20:13 【问题描述】:

前段时间我开始用 phpUnit (v. 9) 编写测试。这很棒而且很棒,但是:

我怎样才能正确地覆盖条件?

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

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

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

问题不存在的情况:

if (true) 
    return 'true';//here is covered

return 'false';//here is not covered    

这没关系,但是在下面:

return (true) ? 'true' : 'false';

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

所以。我做错了什么?

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

【问题讨论】:

【参考方案1】:

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

然而,最近 PHPUnit 也有branch and path coverage。

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

此功能的作者还写了extensive explanation on his blog。

【讨论】:

以上是关于如何在测试代码时完全覆盖条件(例如 PHP 和 xdebug)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用isparta,webpack,jasmine和karma获得准确的代码覆盖率?

Angular 1.x Browserify Jasmine 如何设置代码覆盖测试?

逻辑覆盖测试之3-1 条件与判定

覆盖率啥意思

《Junit》——软件工程作业.vo2

黑盒测试 白盒测试 题