我刚刚开始使用PHPUnit及其丰富多彩的代码覆盖率报告。我知道所有数字和百分比都保存一个:CRAP索引。谁能为我提供扎实的含义,如何分析以及如何降低它的解释?
我刚刚开始使用PHPUnit及其丰富多彩的代码覆盖率报告。我知道所有数字和百分比都保存一个:CRAP索引。谁能为我提供扎实的含义,如何分析以及如何降低它的解释?
Answers:
@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)
基本上,它希望成为方法更改风险的预测指标。
它有两个因素:
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%,然后重构方法以降低循环复杂度。您可以在进行测试之前尝试进行重构,但是如果您不能(由于所涉及的复杂性)无法推理出所做更改的所有后果,则根据实际方法的复杂性,有可能导致破坏。
function example() { $dep = new Dependency(); return $dep->someFunction(); }
更难测试(模拟逻辑可以是可怕的,特别是与PHP)比function crappy($param) { switch ($param) { // 30 different cases with if-elses } }