我们假设我们有以下代码:
public void testIt(boolean a, boolean b){
if (a){
...
}
if (b){
....
}
}
据我所知,有三种方法可供计算。我将使用其中两个:区域公式和经验法则。
使用区域公式,我们有两个区域if(a){this is the first one}
和if (b) {this is the second one}
。所以CC =两个区域+1 = 3。
经验法则来自Testing for ISTQB Advanced Level Technical Test Analyst vol 3
本书:
现在,这对于像这样的小型,适度的方法来说非常简单。 对于较大的函数,绘制图形并进行计算 它真的很痛苦。所以,一个简单的经验法则是:伯爵 分支和循环结构并添加1. if语句, for,while和do / while构造,每个都算作一个。为了 switch / case结构,每个case块计为一个。在if和 梯子如果构造,最后的其他不计。用于开关/外壳 构造,默认块不计。这是一条经验法则, 但它通常似乎有用。
因此,根据这条规则,如果条件+1 = 3,CC = 2。
然而,在与一个用户聊天的stackoverflow上,我说这个代码的CC = 4(他使用了第三种方法),并提供了该用户的以下图像:
那么这段代码的圈复杂度是多少? 3或4或?
答案 0 :(得分:2)
M = E − N + 2P,
,其中
E = the number of edges of the graph. N = the number of nodes of the graph. P = the number of connected components.
M = 7 - 6 + 1 * 2 = 3
关于软件测试,它意味着:
M是实现完整分支覆盖所必需的测试用例数的上限。
M是通过控制流图(CFG)的路径数下限。
以上所有三个数字可能相等:分支覆盖率< =圈复杂度< =路径数。
因此,您需要进行2次测试才能提供分支覆盖。但这并不意味着它将覆盖所有路径。
要覆盖所有路径,您需要进行4次测试。
要理解它,请考虑对代码进行更新:
public String testIt(boolean a, boolean b){
String s = "";
if (a) s = s+"a";
if (b) s = s+"b";
return s;
}
覆盖两个分支,你可以测试(真,真)和(假,假)
但可能的路径(结果)数量为4:
"", "a", "b", "ab"
对于2 <= 3 <= 4