有一个很好的工具来生成单元测试用例,例如.NET或Java项目,它会生成单元测试用例,覆盖几乎100%的代码覆盖率.测试用例的数量可以与代码的圈复杂度成正比(循环嵌套和条件越高,圈复杂度越高),其中圈复杂度越高,生成的测试用例集越大.我并不期望它能够完全正常运行(比如说我要构建单元测试并在生成之后运行它),但是我会说它可以在测试用例中有一个模板样式来修改适合您的预期需求的情况.但它也应该有一个适当的设置和拆卸方法,并且足以检测是否应该使用单元测试的模拟对象,如果存在任何依赖性.那么,是否存在这样的工具?
我在维基百科上找到了关于圈复杂度的以下段落:
可以证明,只有一个入口点和一个出口点的任何结构化程序的圈复杂度等于该程序中包含的决策点(即"if"语句或条件循环)的数量加一.
这意味着两个任意嵌套if语句的圈复杂度为3:
if (a)
{
if (b)
{
foo();
}
else
{
bar();
}
}
else
{
baz();
}
Run Code Online (Sandbox Code Playgroud)
因为将要调用三个函数中的一个,我的内心同意3.
但是,也可以按顺序编写两个任意if语句,而不是嵌套它们:
if (a)
{
foo();
}
else
{
bar();
}
if (b)
{
baz();
}
else
{
qux();
}
Run Code Online (Sandbox Code Playgroud)
现在代码中有四条路径:
因此,这个片段的圈复杂度不应该是4而不是3吗?
我误解了引用的段落吗?
insertion_procedure (int a[], int p [], int N)
{
int i,j,k;
for (i=0; i<=N; i++) p[i] = i;
for (i=2; i<=N; i++)
{
k = p[i];
j = 1;
while (a[p[j-1]] > a[k]) {p[j] = p[j-1]; j--}
p[j] = k;
}
}
Run Code Online (Sandbox Code Playgroud)
我必须找到这个代码的圈复杂度,然后建议一些白盒测试用例和黑盒测试用例.但我无法为代码制作CFG.
非常感谢对测试用例的一些帮助.
在Sonar中,对于特定的Java类,我看到:
Complexity: 830
Complexity /method: 8,1
Run Code Online (Sandbox Code Playgroud)
你怎么能解释这两个指标之间的区别?
"复杂性"是阶级复杂性吗?
一个班级应该承担的最大复杂性是多少?我知道方法复杂度的方法应该小于10,但是一个类应该符合的最大类复杂度数是多少?
谢谢.
编辑
我还看一下文件中的Cyclomatic-Complexity规则违规.
对于许多方法,声纳说具有不同的复杂度数字(法语):
"Lacomplexitécyclomatiquede la classe est de 28 alors que lemaximumautoriséestde 10."
用英语讲 :
"类圈复杂度为28,但允许的最大值为10".
我不明白为什么它说"类圈复杂度",因为它似乎是"方法圈复杂度".
此外,有问题的类没有出现在按平均复杂度/方法排序的最复杂的类之上,因为声纳说它只有8,1平均方法复杂度.
我想知道有没有办法找到在Xcode中创建的项目的圈复杂度.
谢谢
我的大多数JavaScript代码文件都是这样的:
(function() {
var Foo = function() {
...
};
var Bar = function() {
...
};
...
}());
Run Code Online (Sandbox Code Playgroud)
我已经尝试了许多计算代码的圈复杂度的工具,它们都会生成错误的报告(从我的角度来看),即:它们都将指向包装函数的指针视为最复杂的.
问题在于所有报告都被这一事实严重扭曲:包装函数通常占复杂饼图的一半以上,并且所有平均数都有偏差.
有没有办法获得我的代码的真正复杂性,而不是包装函数的偏见?
所有这些工具都做错了吗?我做错了将我的代码包装在一个函数中用于作用域(我不这么认为)?使用这些工具我做错了吗?
有人建议在计算复杂性之前删除包装函数,我很乐意这样做,但是有一种可靠的方法可以自动完成吗?请忽略这一点并寻求合适的解决方案.
我想要一个工具来分析我的代码质量,经过一些谷歌搜索后,我想我明白Cyclomatic Complexity可以从这里开始.我试图让几个工具工作,但没有成功(发现大多数是为Java开发的).我的要求是:
我将不胜感激任何帮助
我对switch语句的CC感到困惑
如果我有以下代码:
if (n >= 0) {
switch(n) {
case 0:
case 1:
printf("zero or one\n");
break;
case 2:
printf("two\n");
break;
case 3:
case 4:
printf("three or four\n");
break;
}
}
else {
printf ("negative\n");
}
Run Code Online (Sandbox Code Playgroud)
什么是CC?
我发现一个帖子说它是5,用这个图表

(边缘是17,而不是16,我认为这是一个错字)
它说我们只需要将案例0和案例1统一为一
但我认为图表应该是:

边缘:17,
节点:
13,17 - 13 + 2P = 6
我将每个案例都算作1
我的OOSE教授说这是6,但方式不同
他说:
init => 1
if => 1
switch => 1
case 0 1 => 1
case 2 => 1
case 3 4 => 1
Run Code Online (Sandbox Code Playgroud)
所以它应该是6
什么是正确的答案? …
LINQ和Lambda表达式是否会降低圈复杂度?只是很好奇,因为当VS分析器增加时,CodeRush实际上显示了cc的减少.
然而,还有另一个称为"必要的循环复杂性"的术语.
这两个代码指标之间有什么区别和相似之处?他们的典型接受价值是什么?此外,我了解到,为了理解代码,Essential Cyclomatic Complexity是一个更相关的指标.而从实施的角度来看,Cyclomatic Complexity是最相关的.如果是这样,为什么?
c ×2
.net ×1
black-box ×1
c# ×1
code-metrics ×1
control-flow ×1
if-statement ×1
ios ×1
java ×1
javascript ×1
jshint ×1
lambda ×1
linq ×1
sonarqube ×1
unit-testing ×1
white-box ×1
xcode ×1