概念:又称白盒测试,是基于测试对象的代码、数据或者系统架构而进行测试的一种技术
关注测试对象的内部结构
基于结构的测试技术的共同特点为:
① 测试对象的内部结构信息是设计测试用例的依据,如程序代码和设计架构
② 测试对象的覆盖率可通过已有的测试用例测量,并且可系统地增加测试用例来提高覆盖率
要求:测试人员需详细了解测试对象的内部结构
步骤:
① 分析测试对象的具体实现和内部结构
② 识别测试对象的不同路径(选择合适的代码覆盖标准,如语句覆盖)
③ 选择合适的输入数据覆盖测试对象的相关路径并确定期望结果
④ 执行测试用例
⑤ 比较测试对象的实际结果和期望结果
⑥ 确定测试对象是否实现了正确的功能
应用:
① 特别适用于低级别测试,如组件测试
② 适用于更高级别测试,如集成测试中考虑的结构是集成模块间调用的树形结构。以及在系统测试过程中测试对象的菜单结构、网页的关联结构和业务流程等。
作用:测试人员可确保识别并测试了测试对象的各种路径
缺点:若路径和输入数据的组合很多,对这些路径进行完全的测试基本不可能,需采取合适的测试技术以满足覆盖率要求。
下引入控制流和控制流图等几个概念
控制流:测试对象中一系列顺序发生的事件或路径
控制流图:在测试对象那个执行过程中所有可能的事件或路径序列的抽象表示
控制流图是控制流测试的基础。
基于结构的测试中首先将测试对象的代码转换为相应控制流图,然后分析其中的路径,并根据分析的结果创建相应的测试用例。
控制流图组成
① 过程块
② 决策点
③ 汇聚点
控制流图缺点:
① 路径庞大时有限时间内穷尽测试难以实现
② 根据规格说明所设计的代码可能在模块中遗漏某些路径,而控制流测试依据测试对象实现的路径展开,所以无法发现遗漏的路径。
③ 测试对象对小部分数据可能无法正确执行
下介绍基于结构的各种测试技术
2.1 语句测试
概念:设计若干测试用例来执行程序代码中的语句
语句覆盖指被执行的语句数与所有可能的语句数之间的比值
案例1
if(a>0&&b>0){c=c/a;} if(a>1||c>1){c=c+1;} c=c+b;
化成控制流图
满足100%语句覆盖准则所对应的测试用例
测试用例ID | 输入a、b和c | 输出a、b和c | 满足的判定 | 覆盖的路径 |
1 | a=1、b=2且c=3 | a=1、b=2且c=6 | T1T2 | abdegh |
其它测试用例
测试用例ID | 输入a、b和c | 输出a、b和c | 满足的判定 | 覆盖的路径 |
2 | a=1、b=2且c=-3 | a=1、b=2且c=-1 | T1F2 | abdfh |
3 | a=-1、b=2且c=3 | a=-1、b=2且c=6 | F1T2 | acegh |
尽管语句测试可识别没有测试到的代码块,但可能无法正确判断程序代码中的逻辑关系
例:案例1中语句测试无法发现(a>0&&b>0)错写为(a>0||b>0)
语句覆盖可能会遗漏多个路径(本案例共4条路径)
尽管语句覆盖是最低级别的测试覆盖,在实际测试中达到100%的语句覆盖也不易
2.2 判定测试
概念:是种针对判定结果设计测试用例的技术。
判定覆盖:执行测试套件能够覆盖的判定结果百分比
低级别测试中,判定覆盖可作为出口准则之一。例:测试出口准则可要求测试对象达到100%的判定覆盖,100%的判定覆盖可保证100%的语句覆盖。
案例1中(T1 T2)和(F1 F2)两个用例满足100%判定覆盖
测试用例ID | 输入a、b和c | 输出a、b和c | 满足的判定 | 覆盖的路径 |
1 | a=1、b=2且c=3 | a=1、b=2且c=6 | T1T2 | abdegh |
2 | a=-1、b=2且c=-3 | a=-1、b=2且c=-1 | F1F2 | acfh |
或者用(T1 F2)和(F1 T2)两个用例满足100%判定覆盖
测试用例ID | 输入a、b和c | 输出a、b和c | 满足的判定 | 覆盖的路径 |
3 | a=1、b=2且c=-3 | a=-1、b=2且c=-1 | T1F2 | abdfh |
4 | a=-1、b=2且c=3 | a=-1、b=2且c=6 | F1T2 | acegh |
可以看出,100%的判定覆盖可保证100%的语句覆盖。
判定测试可发现程序中的逻辑错误,但并不能保证发现判定中原子条件的错误
2.3 条件测试
概念:设计若干测试用例来执行不同条件的结果
条件覆盖指被执行条件能够覆盖原子条件的百分比,需要注意条件覆盖并不比判定覆盖更强。
举例:黑体T和F表示判定的真假,普通T和F表示判定中条件的真假。
测试用例ID | 输入a、b和c | 输出a、b和c | 满足的判定 | 覆盖的路径 |
3 | a=1、b=2且c=-3 | a=-1、b=2且c=-1 | T1F2 | abdfh |
4 | a=-1、b=2且c=3 | a=-1、b=2且c=6 | F1T2 | acegh |
可得原子条件的所有组合及满足条件的取值。
若要测试对象满足100%的条件覆盖,那么根据定义需将判定中的每个原子取值分别取真和假一次。
举例
表
上例中100%的条件覆盖也满足了100%的判定覆盖,但条件覆盖不保证100%判定覆盖,举例:
表
所以条件覆盖并不比判定覆盖更强。
条件覆盖也可能无法发现测试对象中的逻辑错误
2.4判定条件测试
概念:指设计若干测试用例来执行条件结果和判定结果
判定条件覆盖指执行测试用例套件能够覆盖的条件结果和判定结果百分比
100%判定条件覆盖意味着100%的判定覆盖和100%的条件覆盖
例
表
满足100%判定条件覆盖并不唯一
2.5条件决定测试
能够独立影响判定结果的单独条件测试