1.6 基于路径和覆盖率的测试
软件测试中的控制流和数据流测试等问题都可以归结为面向路径的测试用例生成问题。该问题可以描述为:给定一个程序P和P中一条路径w,设P的输入空间为D,求x,使得P以x为输入运行,所经过的路径为w。求解面向路径的测试用例生成问题归根到底是一个约束满足问题(Constraint Satisfaction Problem,CSP),即怎样使得生成的用例满足当前路径w上的所有约束。
约束满足问题的求解往往结合使用推理和搜索方法[16]。推理技术本质上是一个问题等价转换技术,即将问题转化为一个更易于求解且与原问题等价的问题;搜索技术则是指在所有变量的当前值域中寻找问题的解。一般来讲,传统搜索算法的搜索空间非常庞大,因而求解算法效率较低。一致性技术(包括弧一致性、路径一致性等)的出现使得求解约束满足问题的效率得到很大提升。在使用搜索算法求解一个约束满足问题时,通常需要使用启发式算法帮助做一些决定,例如,选取哪一个变量进行赋值或者该给某个变量赋何值等[16]。
测试是否完整需要一个判定标准,覆盖率就是判定测试完备性的一个重要指标。判定一个面向路径生成的测试用例是否满足路径上的约束,就要检测该用例是否覆盖了其目标元素;判定一组面向路径生成的测试用例是不是此组约束集合的解,就要检测该组用例是否覆盖这条路径上的所有目标元素。假设测试完成后,当前用例已经覆盖的目标元素个数为t,路径上所有目标元素的个数为T,那么当前用例的覆盖率为
![]()
由此可见,覆盖率与目标覆盖元素个数相关,而目标覆盖元素的确定则与覆盖准则相关。一组优秀的测试用例就是用最少的用例去覆盖最多的目标元素。100%覆盖率是软件测试追求的目标,然而这个目标在实际工程中却很难达到,主要有以下几个原因。
1.程序本身存在不可达路径(https://www.daowen.com)
不可达路径就是指无论为变量在其输入域中取何值均不能满足此条路径中某个或某些约束。为不可达路径生成用例或者生成失败,即选值失败,或者随机生成不满足约束要求的任意用例,使得程序中的某些代码或目标元素无法被覆盖。
2.程序存在死码
程序死码表示在系统实现阶段,由于设计问题,程序存在一些永远不会被执行的代码,因此在生成用例阶段有一些目标元素可能永远不会被覆盖,最终影响覆盖率。
3.测试用例有遗漏
在用例设计阶段,由于测试人员疏漏或者约束求解系统存在的缺陷,生成的测试用例不够完备,不能覆盖所有目标元素,覆盖率不能达到100%。
虽然达到100%的覆盖率是所有软件测试活动追求的目标,但是我们还必须考虑到现实情况中各种条件的限制,用最小的代价完成最完备的测试。因此在软件测试阶段,各个公司、测试项目等需要根据自己的需求和实际情况制定最合适的覆盖准则和测试标准。