《软件测试设计》第2章——基于结构的测试

概念:又称白盒测试,是基于测试对象的代码、数据或者系统架构而进行测试的一种技术

关注测试对象的内部结构

基于结构的测试技术的共同特点为:

① 测试对象的内部结构信息是设计测试用例的依据,如程序代码和设计架构

② 测试对象的覆盖率可通过已有的测试用例测量,并且可系统地增加测试用例来提高覆盖率

要求:测试人员需详细了解测试对象的内部结构

步骤

① 分析测试对象的具体实现和内部结构

② 识别测试对象的不同路径(选择合适的代码覆盖标准,如语句覆盖)

③ 选择合适的输入数据覆盖测试对象的相关路径并确定期望结果

④ 执行测试用例

⑤ 比较测试对象的实际结果和期望结果

⑥ 确定测试对象是否实现了正确的功能

应用

① 特别适用于低级别测试,如组件测试

② 适用于更高级别测试,如集成测试中考虑的结构是集成模块间调用的树形结构。以及在系统测试过程中测试对象的菜单结构、网页的关联结构和业务流程等。

作用:测试人员可确保识别并测试了测试对象的各种路径

缺点:若路径和输入数据的组合很多,对这些路径进行完全的测试基本不可能,需采取合适的测试技术以满足覆盖率要求。

下引入控制流和控制流图等几个概念

控制流:测试对象中一系列顺序发生的事件或路径

控制流图:在测试对象那个执行过程中所有可能的事件或路径序列的抽象表示

控制流图是控制流测试的基础。

基于结构的测试中首先将测试对象的代码转换为相应控制流图,然后分析其中的路径,并根据分析的结果创建相应的测试用例。

控制流图组成

① 过程块

② 决策点

③ 汇聚点

控制流图缺点

① 路径庞大时有限时间内穷尽测试难以实现

② 根据规格说明所设计的代码可能在模块中遗漏某些路径,而控制流测试依据测试对象实现的路径展开,所以无法发现遗漏的路径。

③ 测试对象对小部分数据可能无法正确执行

下介绍基于结构的各种测试技术

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 条件测试

概念:设计若干测试用例来执行不同条件的结果

条件覆盖指被执行条件能够覆盖原子条件的百分比,需要注意条件覆盖并不比判定覆盖更强。

举例:黑体TF表示判定的真假,普通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条件决定测试

能够独立影响判定结果的单独条件测试

时间: 2024-08-01 09:35:05

《软件测试设计》第2章——基于结构的测试的相关文章

MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化

MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化 前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就已经产生了的,后期的优化很多时候所能够带来的改善都只是在解决前妻设计所遗留下来的一些问题而已,而且能够解决的问题通常也比较有限.本章将就如何在 MySQL 数据库 Schema 设计的时候保证尽可能的高效,尽可能减少后期的烦恼. 9.1 高效的模型设计 最规范的就一定

软件测试概述、结构化测试

一.软件测试的目的 是在最小的成本和最短的时间内,通过设计良好的测试规程和测试用例,系统地发现不同类别的错误. 二.软件测试的基本原则 设计好的测试用例.不可能进行穷举测试.尽早开展测试.重点测试.定期进行检验与修正测试用例,并增加新的测试用例.测试依赖于系统环境.测试用例应该包含合理和不合理的输入条件. 测试过程模型 V模型特点:1.对应瀑布模型的变种(自下到上)线性关系 2.有局限性,在于不能体现"尽早地和不断地进行软件测试"的原则 3.仅仅把测试过程作为在需求分析.概要设计.详细

程序设计基础 第五章 选择结构的程序设计(知识点)

第五章  选择结构的程序设计 第一部分: 总结 1根据某种条件的成立与否而采用不同的程序段进行处理的程序结构称为选择结构 2C语言的选择语句包括if 和switch语句 3使用break语句,可以中断switch语句的执行. 4使用goto 语句,可以将程序执行流程无条件专项. 第二部分: 分别简述 5.1用if语句设计选择结构程序 5.1.1  简单的if语句 使用条件:满足条件就执行,不满足就不执行. 格式: If(表达式){语句1} 5.1.2    if_else语句 格式: If(表达

MySQL性能调优与架构设计——第1章 MySQL 基本介绍

MySQL性能调优与架构设计——第1章 MySQL 基本介绍 前言:作为最为流行的开源数据库软件之一, MySQL 数据库软件已经是广为人知了. 但是为了照顾对MySQL还不熟悉的读者,这章我们将对 MySQL 做一个简单的介绍.主要内容包括MySQL 各功能模块组成,各模块协同工作原理, Query 处理的流程等. 1.1 MySQLServer 简介 1.1.1 什么是 MySQLMySQL 是由MySQL AB公司(目前已经被SUN公司收归麾下,SUN已经被Oracle收购)自主研发的,目

在国外,资深的软件测试人员大多是手动测试,他们厉害之处在于测试用例的设计,但在国内,很多测试人员都把自动化测试当成很厉害的资本,为什么?

导语:”在国外,资深的软件测试人员大多是手动测试,他们厉害之处在于测试用例的设计,但在国内,很多测试人员都把自动化测试当成很厉害的资本,为什么?” 偶然在知乎上看到一篇关注度很高的话题,标题如上. 作为一名从业8年有余的软件测试工程师,并且一直在外企做测试的我, 忍不住想发表一些自己的看法和见解. 我觉得在国内,很多公司或者个人把自动化测试当成一个了不起的资本,根本是源于国内大家对代码的无上崇拜,这也造就了国内现在IT互联网行业内一个鄙视链: 开发---> 测试开发--->自动化测试---&g

Java 第三章 选择结构

第三章   选择结构 if基本语法: if(条件){// 表达式 // 代码块 } eg: int a = 10; if(a > 1){ System.out.println("内容"); } if(){ // 代码块}else{ // 代码块}eg:if(score >= 90){ System.out.println("奖励Mp4一个");}else{ System.out.println("枪毙");} 语法:if(条件){ /

重构,改善既有代码的设计--第七章感悟

1.提炼类 某个类做了应该由两个类做的事,需要建立一个新的类,将相关的字段和函数从旧类搬到新类. 先搬较底层函数(就是给别人调用多过于调用别人的),再搬高层函数. 重构,改善既有代码的设计--第七章感悟,布布扣,bubuko.com

第五章 程序结构

返回值 系统自动生成返回值的副本,该副本可以在程序中的返回点获得 函数原型声明 除非函数的定义在相同源文件的前面,否则必须使用函数原型声明(通常在#include和using之后): #include <iostream> using namespace std; double power(double x,int y);  //函数原型声明,形参可以和函数实现不同甚至只写double,int int main() { x=power(y,z); } double power(double x

JavaScript权威指南第02章 词法结构

词法结构 2.1字符集 JavaScript 是Unicode字符集编写,几乎支持地球上所有的语言. 2.1.1区分大小写 javascript是区分大小写的语言. 2.1.2 空格.换行符和格式控制符 javascript会忽略标识之间的空格符.换行符.通过空格和换行可以大大地提高代码的可读性.当需要使用空格和换行符时,使用Unicode的转义来实现. 2.2注释 单行注释     //这里是单行注释 多行注释    /**多行注释 */ 2.3直接量 在程序中能够直接使用的量,比如数字,字符