前言:
本文分为两个部分
1:圈复杂度的概念,和计算方法
2:tessy中如何查看圈复杂度(单元测试为例)
1:圈复杂度的概念,和计算方法
圈复杂度(Cyclomatic Complexity)是一种代码复杂度的衡量标准,由 Thomas McCabe 于 1976年定义。它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的可能情况最少使用的测试用例数。圈复杂度大说明程序代码的判断逻辑复杂,可能质量低且难于测试和维护。程序的可能错误和高的圈复杂度有着很大关系。
void fun_1(int a)
{
if(a)
{printf("a=1");}
else
{printf("a!=1");}
}
通常使用的计算公式是V(G) = e – n + 2 。
e 代表在控制流图中的边的数量(对应代码中顺序结构的部分)
n 代表在控制流图中的节点数量,包括起点和终点(1、所有终点只计算一次,即便有多个return或者throw;2、节点对应代码中的分支语句)。
以上图中的边界数量=4,节点数量=4 故这个简单函数的圈复杂度V(G)=4-4+2=2。
2:tessy中如何查看圈复杂度(单元测试为例)
我们在单元测试的基础上,在添加一个Testobject,就是上图中的代码,结果如下图
红圈交叉部分,CC栏下标注了,圈复杂度,fun_1=2,本身存在的测试对象“is_value_in_range”的圈复杂度为3。
需要注意的是,测试module的圈复杂度=它包含的测试对象复杂度之和,而我们之前说的圈复杂度应当<10,或在特殊情况下<=15,在tessy中是指测试对象的要求。
2.2 Tessy中的另外一个参数TC/C
这个参数指示的是圈复杂度和测试用例数量之间的关系,“is_value_in_range”中存在三条测试用例
TC=测试对象中存在的测试用例数量/CC(圈复杂度)。
为了深刻印象,CC值的改变需要改变代码,不好办。我们可以给测试对象+一条测试用例,
4/3=1.33