我刚刚开始使用PHPUnit及其丰富多彩的代码覆盖率报告。我知道所有的数字和百分比,除了一个: C.R.A.P指数。谁能给我一个可靠的解释,解释它的含义,如何分析它,如何降低它?
发布于 2011-01-19 17:27:02
@Toader Mihai offered a solid explanation. (来自我的+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) {
}
}
(这只是一个简单的例子,我相信你会找到更多的资源)
其他资源:
首先,让我提供一些额外的资源:
Creators blog post about the crap index
以防万一:Cyclomatic complexity explained。像PHP_CodeSniffer和PHPMD这样的工具会告诉你这个数字,以防你想知道。
虽然你可以决定哪个数字是"ok“,但一个经常建议的数字(也就是有点高的imho)是30的一个糟糕的索引,产生了一个如下的图形:
(您可以在以下位置获取.ods文件:https://www.dropbox.com/s/3bihb9thlp2fyg8/crap.ods?dl=1 )
发布于 2011-01-19 12:52:58
基本上,它希望成为方法更改风险的预测器。
它有两个因素:
可测试性( comp(m)
.
cyclomatic complexity
)。基本上,这衡量了在所述代码中有多少决策是自动可测试的。如果方法有100%的覆盖率,那么改变的风险被认为只与方法的复杂性相等:C.R.A.P.(m) = comp(m)
。
如果方法有0%的覆盖率,那么在复杂性度量中,更改的风险被认为是二次多项式(推理是,如果您不能测试代码路径,更改它会增加破坏的风险):C.R.A.P.(m) = comp(m)^2 + comp(m)
希望这能对你有所帮助。
我只是注意到我只提供了一半的答案(阅读部分)。如果你理解了索引的原理,那么如何改进它应该是非常清楚的。但在@edorian's answer中给出了更清晰的解释。
简短的故事是:编写测试,直到您拥有接近100%的覆盖率,然后重构方法以降低圈复杂度。您可以尝试在进行测试之前进行重构,但根据实际的方法复杂性,如果您不能推理(因为涉及的复杂性)您正在进行的更改的所有后果,那么您就有可能引入破坏。
https://stackoverflow.com/questions/4731774
复制相似问题