如何阅读/提高 PHP 计算的 C.R.A.P 指数
我刚刚开始使用PHPUnit及其丰富多彩的代码覆盖率报告。我理解所有的数字和百分比,除了一个:C.R.A.P指数。任何人都可以给我一个坚实的解释,解释它的含义,如何分析它以及如何降低它?
我刚刚开始使用PHPUnit及其丰富多彩的代码覆盖率报告。我理解所有的数字和百分比,除了一个:C.R.A.P指数。任何人都可以给我一个坚实的解释,解释它的含义,如何分析它以及如何降低它?
@Toader米哈伊提供了一个可靠的解释。(+1 来自我)
编写不太复杂的代码或编写经过更好测试的代码。(见下图)
经过更好测试的代码 ?
在这种情况下,这只是意味着:更高的代码覆盖率,通常会导致编写更多的测试。
不太复杂的代码?
例如:将方法重构为较小的方法:
// Complex
function doSomething() {
if($a) {
if($b) {
}
if($c) {
}
} else {
if($b) {
}
if($c) {
}
}
}
// 3 less complex functions
function doSomething() {
if($a) {
doA();
} else {
doNotA();
}
}
function doA() {
if($b) {
}
if($c) {
}
}
function doNotA() {
if($b) {
}
if($c) {
}
}
(只是一个微不足道的例子,你会找到更多的资源,我敢肯定)
首先,让我提供一些额外的资源:
以防万一:解释了环形复杂性。PHP_CodeSniffer和PHPMD等工具会告诉您该数字,以防您想知道。
虽然由您来决定哪个数字是“好的”,但一个经常建议的数字(恕我直言,这是一个很小的高)是一个30的废话索引,导致这样的图表:
(你可以在这里得到.ods文件: https://www.dropbox.com/s/3bihb9thlp2fyg8/crap.ods?dl=1 )
基本上,它想成为一种方法改变风险的预测器。
它有两个因素:
cyclomatic complexity
comp(m)
如果该方法具有 100% 的覆盖率,则认为更改的风险仅与方法的复杂性等效:。C.R.A.P.(m) = comp(m)
如果该方法的覆盖率为0%,则在复杂性度量中,更改的风险被认为是二级策略式(推理是,如果您无法测试代码路径更改,则会增加中断的风险):C.R.A.P.(m) = comp(m)^2 + comp(m)
希望这会对您有所帮助。
我刚刚注意到我只提供半个答案(阅读部分)。如果您了解索引的推理,如何改进它应该非常清楚。但@edorian的答案给出了更清晰的解释。
简短的故事是:编写测试,直到你有接近100%的覆盖率,然后重构方法以降低循环复杂性。您可以在进行测试之前尝试重构,但根据实际方法的复杂性,如果您无法推理(由于所涉及的复杂性)您正在执行的更改的所有后果,则可能会引入中断。