C/C++单元测试工具Visual Unit 4在线帮助


路径数量巨大时如何覆盖?

    有些函数,统计出来的路径有几十条,甚至几百上千条,如何实现100%路径覆盖?

    路径多达几千条时,路径及路径覆盖统计已失去实用意义,且由于路径及路径覆盖统计算法复杂,需耗费较长测试时间,这种情形下VU只统计部分路径,并在信息窗口路径覆盖率的右侧提示“路径过多”。

    首先明确路径覆盖的目的,路径覆盖与其他覆盖一样,都不是为了“好看”,而是为了充分测试,即把遗漏的输入(等价类)找出来并进行测试。路径的本质是代码组合,一个代码组合很可能对应一种输入(一个等价类),所以使用路径覆盖来衡量测试的完整性、找出隐藏很深的遗漏用例,具有很高的价值,但这种价值与代码的设计有关,代码结构越好,路径覆盖的价值就越高。当路径数量很多时,可以使用以下方法:

1. 考虑代码重构,把一些代码独立到子函数中
    路径的本质是代码组合,如果把两块或多块本来相对独立的代码放在一起(这种情况我们称为“低内聚”),就可能产生出大量代码组合,其中很多组合并不对应等价类。在这种情况下,用路径覆盖来找出遗漏的输入,效费比就会很低,可以考虑把其中一些代码独立到子函数中。“低内聚”的代码在逻辑结构图中具有明显的特征:两个或多个复杂的分支结构呈“串联”状(多个简单的分支“串联”在一起,可以视为一个复杂的分支结构)。

2. 交替屏蔽部分分支结构
    把部分分支结构删除,实现100%路径覆盖,然后恢复,并删除另一部分,再实现100%路径覆盖。这实际上是重构代码的代替方案,对于上图,屏蔽左边的分支结构,相当于把左边分支结构对应的代码独立到子函数后进行路径覆盖;恢复左边,屏蔽右边,相当于测试子程序并实现路径覆盖。这种方案对于测试效果来说是可以接受的,但并没有达到改良代码结构的效果,一般适合于由测试部门进行单元测试,不方便重构代码的情形。请参考逻辑结构图裁剪

3. 先完成语句、条件、分支覆盖,删除不可覆盖的分支
    所有经过已删除的分支的路径都会自动删除,从而减少路径数量。

总结
    路径覆盖的目的是把遗漏的输入找出来并进行测试,可覆盖的路径数量与等价类的数量有大致的对应关系,例如,一个把人民币金额小写转大写的程序,可能很复杂,路径有几百条,但等价类也就十种八种,可覆盖的路径数量可能也就十条八条。灵活运用上述方法,可以去除大多数无意义的路径,把真正对应等价类的路径找出来,从而实现充分的测试。