1.画出程序控制流程图

  圈中的数字代表的是语句的行号,也许有人问为什么选4,6,13,8......作为结点,第2行,第3行为什么不是结点,因为选择结点是有规律的。让我们看程序中;第2行,第3行是按顺序执行下来的。直到第4行才出现了循环操作。而2,3行没有什么判断,选择等分支操作,所以我们把2,3,4全部合并成一个结点。其他的也是照这个规则合并,然后有了上面的流程图。

  2.计算圈复杂度

  有了图以后我们要知道到底我们有写多少个测试用例,才能满足基本路径测试。

  这里有有了一个新概念——圈复杂度

  圈复杂度是一种为程序逻辑复杂性提供定量测试的软件度量。将该度量用于计算程序的基本独立路径数目。为确保所有语句至少执行一次的测试数量的上界。
公式圈复杂度V(G)=E+N+2,E是流图中边的数量,N是流图中结点的数量。

  公式圈复杂度V(G)=P+1 ,P是流图G中判定结点的数量。

  通俗的说圈负责度是判断单元是不是复杂,是不是好测试的标准。一般来说如果圈复杂度如果大于20表示这个单元的可测试性不好,太复杂(也许有人觉得无所谓,但是如果你们公司实行了CMMI5的话,对这个是有规定的)。

  从图中我们可以看到,

  V(G)=10条边-8结点+2=4
  V(G)=3个判定结点+1=4

  上图的圈复杂图是4。这个结果对我们来说有什么意义呢?它表示我们只要多4个测试用例可以达到基本路径覆盖。

  3.导出程序基本路径。

  现在我们知道了起码要写4个测试用例,但是怎么设计这4个测试用例?

  导出程序基本路径,根据程序基本路径设计测试用例子。

  程序基本路径:基本独立路径是从程序的开始结点到结束可以选择任何的路径遍历,但是每条路径至少应该包含一条已定义路径不曾用到的边。(看起来不好理解,让我们看例子)。
让我们看上面的流程图:从结点4到24有几条路径呢?

  1 B(4,24)
  2 C,E,J(4,6,8,24)
  3 C,D,F,H,A,B(4,6,13,15,22,4,24)
  4 C,D,G,I,A,B(4,6,13,19,22,4,24)

  还有吗??

  5 C,D,C,I,A,C,E,J(4,6,13,19,22,4,6,8,24)算吗?

  不算,为什么?因为上面的4条路径已经包括了所有的边。第5条路径已经不包含没有用过的边了。所有的路径都遍历过了。

  好了,现在我们有了4条基本独立路径根据独立路径我们可以设计测试用例。

  1 B(4,24)
  输入数据:i_flag=0,或者是i_flag<0的某一个值。
  预期结果:i_temp=0.

  2 C,E,J(4,6,8,24)
  输入数据: i_count =1; i_flag=0
  预期结果:i_temp=101.

  3 C,D,F,H,A,B(4,6,13,15,22,4,24)
  输入数据: i_count =1; i_flag=1
  预期结果:i_temp=10.

  4 C,D,G,I,A,B(4,6,13,19,22,4,24)
  输入数据: i_count =1; i_flag=2
  预期结果:i_temp=20.

  这里的输入数据是有路径和程序推论出来的。而要注意的是预期结果是从函数说明中导出,不能根据程序结构中导出。

  为什么这么说?

  让我们看程序中的第3行。

  int i_temp=0; 假如开发人员一不小心写错了,变成了int i_temp=1; 根据程序导出的预期结果会是一个错误的值,但是单元测试不出来问题,那单元测试失去了意义。

  有人也许会问这么简单的函数有4个测试用例,如果还复杂一些的怎么办?上面的测试用例还可以简化吗?答案是可以。

  我们来看 路径 1 B(4,24)和 4 C,D,G,I,A,B(4,6,13,19,22,4,24),路径1是路径4的真子集,所以1是可以不必要的。上图的圈复杂度是4。这个结果对我们来说有什么意义呢?它表示我们只要多4个测试用例可以达到基本路径覆盖。所以说圈复杂度标示是多的测试用例个数,不是一定要4个测试用例才可以。不过有一点要申明的是测试用例越简化代表你的测试越少,这样程序的安全性越低了。

  四、完成测试

  接下来根据测试用例使用工具测试NUNIT,VS2005都可以。

  接下来根据测试结果编写测试报告,测试人,时间,结果,用例,是否通过,格式网上一大把,每个公司的格式也不一样不说了。