如何阅读/改进PHP计算的CRAP索引


73

我刚刚开始使用PHPUnit及其丰富多彩的代码覆盖率报告。我知道所有数字和百分比都保存一个:CRAP索引。谁能为我提供扎实的含义,如何分析以及如何降低它的解释?

Answers:


110

@Toader Mihai提供了扎实的解释。(我的+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之类的工具会告诉您该数字,以备不时之需。

当您决定什么数字是“ ok”时,一个经常被建议的数字(即小高的恕我直言)是废话指数为30的图形,如下所示:

替代文字 (您可以在此处获取.ods文件:https ://www.dropbox.com/s/3bihb9thlp2fyg8/crap.ods?dl =1


2
这是一张最多5张绿色,6-10张黄色和10张以上红色的图像:i.imgur.com/wwX1TbZ.png
dave1010 2014年

@edorian .ods链接已损坏。您有新的链接要提供吗?
Niko9911

1
@ Niko9911更新了链接
edorian

64

基本上,它希望成为方法更改风险的预测指标。

它有两个因素:

  • 方法的代码复杂度(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%,然后重构方法以降低循环复杂度。您可以在进行测试之前尝试进行重构,但是如果您不能(由于所涉及的复杂性)无法推理出所做更改的所有后果,则根据实际方法的复杂性,有可能导致破坏。


1
它没有考虑的一件事是依赖性。一个简单的function example() { $dep = new Dependency(); return $dep->someFunction(); }更难测试(模拟逻辑可以是可怕的,特别是与PHP)比function crappy($param) { switch ($param) { // 30 different cases with if-elses } }
尤哈Untinen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.