如何阅读/改进由PHP计算的C.R.A.P指数

时间:2011-01-19 04:36:24

标签: php unit-testing phpunit

我刚开始使用PHPUnit及其丰富多彩的代码覆盖率报告。我理解所有数字和百分比除了一个:C.R.A.P指数。任何人都可以向我提供一个可靠的解释,它是什么意思,如何分析它以及如何降低它?

2 个答案:

答案 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>

alt text (您可以在此处获取.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%的覆盖率,然后重构这些方法来降低圈复杂度。您可以在进行测试之前尝试重构,但如果您无法推断(因为涉及的复杂性)您正在进行的更改的所有后果,则根据实际方法的复杂性,您可能会引入破损。