Phpunit 代码覆盖率和返回率
我今天使用测试覆盖率运行Codeception,但如果我有以下代码段,我会感到奇怪:Phpunit 代码覆盖率和返回率,phpunit,code-coverage,codeception,Phpunit,Code Coverage,Codeception,我今天使用测试覆盖率运行Codeception,但如果我有以下代码段,我会感到奇怪: return $created; } 带有}的行标记为死代码,因此不计入代码覆盖率的百分比 问题-它应该这样工作吗?我该怎么做才能使它在代码覆盖率中占到百分比,而不是标记为死代码 现在我可以有两个代码覆盖率为94%的文件,但其中一个可能是100%的代码覆盖率,因为这些行只有} 编辑 我刚刚检查了它,并查看了以下代码: public function paginate( $perPage = 50,
return $created;
}
带有}
的行标记为死代码
,因此不计入代码覆盖率的百分比
问题-它应该这样工作吗?我该怎么做才能使它在代码覆盖率中占到百分比,而不是标记为死代码
现在我可以有两个代码覆盖率为94%的文件,但其中一个可能是100%的代码覆盖率,因为这些行只有}
编辑
我刚刚检查了它,并查看了以下代码:
public function paginate(
$perPage = 50,
array $columns = ['*'],
array $order = ['type', 'orderby', 'type_value']
) {
return parent::paginate($perPage, $columns, $order);
}
所有内容都按代码覆盖率的百分比计算。但是,列表行仍然标记为死代码。首先,不要过于关注100%的代码覆盖率。拥有100%的代码覆盖率并不意味着你的代码完全没有bug。创建有意义并正确测试代码的单元测试比仅仅添加不相关的测试或花费大量时间重写代码以获得100%的代码覆盖率要重要得多 第二,如果不看更多的代码,就无法回答您的问题。我在这里做了一个很大的假设,但是我假设您的return语句在一个条件块中的某个地方,而不是在函数的末尾。如果是这样,这样的方法可能会“解决”你的问题
function returnTest($created) {
if(!shouldThisMethodReturnCreated()) {
$returnValue = false;
} else {
$returnValue = $created;
}
return $returnValue;
}
首先,不要过分关注100%的代码覆盖率。拥有100%的代码覆盖率并不意味着你的代码完全没有bug。创建有意义并正确测试代码的单元测试比仅仅添加不相关的测试或花费大量时间重写代码以获得100%的代码覆盖率要重要得多 第二,如果不看更多的代码,就无法回答您的问题。我在这里做了一个很大的假设,但是我假设您的return语句在一个条件块中的某个地方,而不是在函数的末尾。如果是这样,这样的方法可能会“解决”你的问题
function returnTest($created) {
if(!shouldThisMethodReturnCreated()) {
$returnValue = false;
} else {
$returnValue = $created;
}
return $returnValue;
}
这是收集测试覆盖率数据的一种结果,这种方法传统上是使用PHP和XDEBUG来完成的。XDEBUG捕获了一个事实,即PHP P-code引擎已经执行了一条PHP语句。“}”不是一个语句!因此,“覆盖的行”收集的数据不包括“}”,因为它实际上没有执行。它可能比你的例子更糟;考虑:
public function foo() {
if (...) {
return ...;
}
if (...) {
return ...;
}
...
}
PHP执行引擎不“执行”任何“}”。他们很可能都被标记为死亡
还有其他PHP测试覆盖率工具将测试(分支)点与源代码结构显式关联。通过这种关联,任何被覆盖(执行)的测试/分支点都会隐式地覆盖相应的代码结构。这将包括任何块的开始和结束大括号,包括功能块。。。因此,您遇到的具体问题不会发生。以这种方式捕获覆盖率数据可以比语句更精细;考虑“x?y:z”运算符。 这是用传统的用XP调试PHP的方式来收集测试覆盖数据的结果。XDEBUG捕获了一个事实,即PHP P-code引擎已经执行了一条PHP语句。“}”不是一个语句!因此,“覆盖的行”收集的数据不包括“}”,因为它实际上没有执行。它可能比你的例子更糟;考虑:
public function foo() {
if (...) {
return ...;
}
if (...) {
return ...;
}
...
}
PHP执行引擎不“执行”任何“}”。他们很可能都被标记为死亡
还有其他PHP测试覆盖率工具将测试(分支)点与源代码结构显式关联。通过这种关联,任何被覆盖(执行)的测试/分支点都会隐式地覆盖相应的代码结构。这将包括任何块的开始和结束大括号,包括功能块。。。因此,您遇到的具体问题不会发生。以这种方式捕获覆盖率数据可以比语句更精细;考虑“x?y:z”运算符。我已经添加了更多代码。它被计算为代码覆盖率,但仍然标记为
死代码
。应该这样吗?我添加了更多的代码。它被计算为代码覆盖率,但仍然标记为死代码
。这样行吗?谢谢你的详细介绍explanation@Ira您使用的哪种工具最好地涵盖了这一点?我已经试过几次了,但还没有决定使用哪种方法,可以使用一些指导,同时也可以帮助其他找到答案的人。与其说是“使用”,不如说是“提供”。我们的PHP测试覆盖率工具具有我上面描述的“nice”属性。谢谢你的详细介绍explanation@Ira您使用的哪种工具最好地涵盖了这一点?我已经试过几次了,但还没有决定使用哪种方法,可以使用一些指导,同时也可以帮助其他找到答案的人。与其说是“使用”,不如说是“提供”。我们的PHP测试覆盖率工具具有我上面描述的“nice”属性。请看,只是想知道,如果您的函数体所做的只是调用它的父函数,那么您为什么要定义它?仅为$perPage、$columns和$order设置不同的默认值?此外,请检查您的PHP、PHPUnit和Xdebug版本——这可能只是想知道,如果您的函数体只调用它的父函数,那么您为什么要定义它?仅为$perPage、$columns和$order设置不同的默认值?此外,请检查您的PHP、PHPUnit和Xdebug版本-它可能与