我刚开始使用PHPUnit及其丰富多彩的代码覆盖率报告。我理解所有数字和百分比除了一个:C.R.A.P指数。任何人都可以向我提供一个可靠的解释,它是什么意思,如何分析它以及如何降低它?
答案 0 :(得分:103)
@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 的垃圾索引,导致这样的图形:< / p>
(您可以在此处获取.ods文件:https://www.dropbox.com/s/3bihb9thlp2fyg8/crap.ods?dl=1)
答案 1 :(得分:59)
基本上,它希望成为方法变更风险的预测指标。
它有两个因素:
cyclomatic complexity
)又称所述方法中存在多少决策路径:comp(m)
。如果方法的覆盖率为100%,则认为变更风险仅与方法的复杂性相同:C.R.A.P.(m) = comp(m)
。
如果方法的覆盖率为0%,那么变更风险被认为是复杂性度量中的二级polinoomial(理由是如果你不能测试代码路径,那么改变它会增加破坏的风险):{{ 1}}
希望这会对你有所帮助。
我刚注意到我只提供了半答案(阅读部分)。如果你理解索引的推理,那么如何改进它应该很清楚。但是在@edorian's answer中给出了一个更明确的解释。
简短的故事是:编写测试直到你有接近100%的覆盖率,然后重构这些方法来降低圈复杂度。您可以在进行测试之前尝试重构,但如果您无法推断(因为涉及的复杂性)您正在进行的更改的所有后果,则根据实际方法的复杂性,您可能会引入破损。