版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3章 软件测试基本技术,3.1 黑盒测试与白盒测试 3.2 白 盒 测 试技术 3.3 黑 盒 测 试技术,3.1 黑盒测试与白盒测试,任何工程产品都可以使用白盒测试和黑盒测试两种方法之一进行测试。 1黑盒测试 黑盒测试:在测试时,把被测程序视为一个不能打开的黑盒子,完全不考虑程序的内部结构和内部特性下进行的测试。 已知产品的功能设计规格和用户手册,可以进行测试证明每个功能是否实现、每个实现了的功能是否符合要求,以及产品的性能是否满足用户的要求。,黑盒测试的过程,黑盒测试主要是为了发现以下几类错误: 1. 是否有不正确或遗漏的功能? 2. 在接口上,输入是否能正确的接受?能否输出正确的结果?
2、 3. 是否有数据结构错误或外部信息(例如数据文件)访问错误? 4. 性能上是否能够满足要求? 5. 是否有初始化或终止性错误?,黑盒测试的优缺点,优点: 1、 简单,不需要了解程序的内部结构 2、与软件的内部实现无关 3、从用户角度出发,能很容易知道用户会用到哪些功能,遇到哪些问题 4、基于说明书,知道软件实现了说明书哪些功能 5、采用自动化测试,较为方便 缺点: 1、不可能覆盖所有的代码 2、不能测试程序内部特定部位 3、程序中代码未执行的代码无法发现错误 4、无法发现说明书本身存在问题的问题,2白盒测试 白盒测试:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,
3、所有内部成分是否以经过检查。 软件的白盒测试是对软件的过程性细节做细致的检查,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。,白盒测试过程,白盒测试须对程序模块进行如下检查: 1. 保证一个模块中的所有独立路径至少被使用一次 2. 对所有逻辑值均测试true和false。 3. 在循环的边界和运行的界限内执行循环体。 4. 检查内部数据结构以确定其有效性。,白盒测试优缺点,优点: 1、迫使测试人员去了解软件的实现 2、 检测代码中的每条路径和分
4、支 3、揭示隐藏在代码中的错误 4、对代码的测试进行比较彻底 缺点: 1、白盒测试投入较大,成本较高 2、白盒测试不验证规格的正确性 3、无法检查代码中遗漏的路径和数据敏感性错误,3.2 白 盒 测 试 技 术,白盒测试是一种被广泛使用的逻辑测试方法,也称为结构测试或逻辑驱动测试。 白盒测试对象基本上是源程序,是以程序的内部逻辑为基础的一种测试方法。,白盒测试方法的分类,白盒测试分为静态测试(Static Testing)和动态测试(Dynamic Testing)两大类。 静态测试不实际执行程序,静态测试的主要目的是检查软件的表示和描述是否一致,没有冲突和歧义。 动态测试需要实际运行测试用例
5、,以发现软件中的错误。白盒测试中的动态测试主要包括功能确认与接口测试、覆盖率测试、性能分析、内存分析等。,静态白盒测试,程序的静态测试是在不执行程序的条件下,有条理地仔细审查软件设计、体系结构和代码,从而找出软件错误的过程。 可尽早发现软件缺陷(开发初期),找到动态黑盒测试难以发现或者隔离的软件缺陷(测试后期)。 也可为不了解代码细节的黑盒测试员提供思路。,白盒测试,静态: 1、代码检查法 2、静态结构分析法 3、代码质量度量法 动态: 1、逻辑覆盖法 2、基本路径测试法 3、控制结构测试 4、程序插桩,代码检查法,代码检查包括桌面检查、代码审查和走查等,主要检查 代码和设计的一致性,代码对标
6、准的遵循、可读性,代码逻辑表达的正确性,代码结构的合理性等方面; 发现违背程序编写标准的问题,程序中不安全、不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的内容,包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构检查等内容,代码检查法,代码检查包括 桌面检查(Desk Checking) 代码审查(Inspection) 代码走查(Walk through) 技术评审(Review) 当然在实际工作,我们完全不必要被概念所束缚住,而应根据项目的实际情况来决定采取哪种静态测试形 式,不用严格去区分到底是代码走查,代码审查和还是技术评审。,静态测试-桌面检查,桌面检查
7、:由程序员自己检查自己编写的程序。程序员在程序通过编译之后,进行单元测试设计之前,对源程序代码进行分析,检验,并补充相关的文档,目的是发现程序中的错误。 检查内容: 变量和标识符的交叉引用 子程序、函数、宏的调用、参数 等价性检查 常量检查,常量的取值、数据类型 设计标准检查 风格检查 路径检查,静态测试-桌面检查,由于程序员熟悉自己的程序及其程序设计风格,可以节省很多的检查时间,但应避免主观片面性。这种检查应在软件开发早期实施,最好在设计编码之后、系统测试之前使用。桌面检查的文档是一种过渡性的文档,不是公开的正式文档。通过编写文档,也是对程序的一种下意识的检查和测试,可以帮助程序员发现和抓住
8、更多的错误。管理部门也可以通过审查桌面检查文档,了解模块的质量、完全性、测试方法和开发人员的能力。,静态测试-代码审查和走查,代码审查 由若干程序员和测试员组成一个会审小组,通过阅读、讨论和争议,对程序进行静态分析的过程。 优点 比桌面检查更有效 一旦发现错误,通常就能在代码中对其进行精确定位,降低调试成本。 可以发现成批同一类型错误并得以修正。,静态测试-代码审查和走查,代码审查小组人员(4人组成最佳) 协调人、编码人员、模块的设计人员、一名测试专家 协调人职责 为代码审查分发材料(程序清单、设计规范),安排进程 在代码审查过程中起主导作用 记录发现的所有错误 确保所有错误随后得到改正,静态
9、测试-代码审查和走查,代码审查过程: (1)协调人提前把代码审查常见错误列表、设计规格说明书、控制流程图、程序文本及有关要求、规范等分发给小组成员,作为评审的依据。小组成员在充分阅读这些材料之后,进入审查的第二步。 常见错误列表:把以往所有可能发生的常见错误罗列出来,供与会者对照检查,以提高会审的实效。这个常见错误清单也叫做检查表,它把程序中可能发生的各种错误进行分类,对每一类列举出尽可能多的典型错误,然后把它们制成表格,供在会审时使用。,静态测试-代码审查和走查,代码审查过程: (2)召开程序审查会。在会上,首先由程序员逐句讲解程序的逻辑。在此过程中,程序员或其他小组成员可以提出问题,展开讨
10、论,审查错误是否存在。实践表明,程序员在讲解过程中能发现许多原来自己没有发现的错误,而讨论和争议则促进了问题的暴露。,协调人要确保会议高效进行,参与者将注意力用于查找错误而不是修正错误。修正错误由程序员在会后完成。,会议结束后,程序员得到一份已发现错误清单。如果错误太多或程序要做根本改动,协调人可以再安排一次审查。,静态测试-代码审查和走查,会议理想时间为90-120分钟。时间越长,效率越低。 审查按150行/小时速度进行。 每次会议审查一个或几个模块或子程序。 为了使每个人都采取建设性态度,最好对审查结果进行保密,仅限于参与者内部。如果让管理人员做为考评依据,则与检查过程的目的背道而驰。,静
11、态测试-代码检查和走查,代码审查常见错误列表 (1) 检查代码和设计的一致性; (2) 代码的可读性以及对软件设计标准的遵循情况; (3) 代码逻辑表达的正确性; (4) 代码结构的合理性; (5) 程序中不安全、不明确和模糊的部分; (6) 编程风格方面的问题等。,静态测试-常见错误列表,针对代码的常见错误列表 数据引用错误 数据声明错误 运算错误 比较错误 控制流程错误 接口错误 输入输出错误 其它检查,针对代码的常见错误列表,1.数据引用错误 变量使用前是否赋值或初始化? 容易引起变量使用错误,特别是对于指针或引用变量。 在java中要求变量在使用前必须初始化。 数组下标的范围和类型 是
12、否存在下标越界错误,下表类型是否为整型。 通过指针引用的内存单元是否存在(虚调用)? 如在函数返回局部变量的指针或引用时会产生虚调用错误。 被引用的变量或内存的属性是否与编译器预期的一致? 如A类型的指针或引用是否指向的是非A类型对象。,针对代码的常见错误列表,2.数据声明错误 是否所有变量都已声明? 绝大多数编程语言要求变量先定义后使用,可保证变量使用的安全性。 默认的属性(默认值)是否正确? 变量的初始化是否正确?变量的初始化是否与其存储空间的类型一致? 是否每个变量都有正确的长度、类型和存储类别? 是否存在相似名称的变量?,3.运算错误 是否存在非算术变量之间的运算? 是否存在混合模式的
13、运算?( int与float类型,例) 是否存在不同字长变量之间的运算?(int与long类型) 目标变量大小是否小于所赋值的大小?(精度损失或越界错误) 中间结果是否上溢或下溢? 是否存在除0错误? 操作符的优先顺序是否正确? 整数除法是否正确?(精度问题,如2*(i/2)=i),针对代码的常见错误列表,针对代码的常见错误列表,int x = 1; int y = 2; float z = 0; z = x/y; System.out.println (z = z); OUTPUT: z = 0,针对代码的常见错误列表,4.比较错误 是否有不同类型数据的比较运算?(如日期与数字) 是否有混合
14、模式或不同长度数据的比较运算? 比较运算符是否正确?(如至多、至少,不小于) 布尔表达式(与、或、非)是否正确? 比较运算符是否与布尔表达式相混合?(如2z)),5.控制流程错误 是否所有循环都能终止?(循环结束条件是否能满足以及递归的终止条件是否能满足。) 是否存在由于入口条件不满足而跳过循环体?(do-while循环,例) 是否存在仅差一个的循环错误?(如for(int i=0;i=10;i+)) 程序结构中括号是否匹配、if,else是否匹配、do,while是否匹配、try,catch是否匹配等。,针对代码的常见错误列表,针对代码的常见错误列表,6.接口错误 形参和实参的数量是否相等?
15、 形参的属性是否与实参的属性相匹配? 形参的属性是否与实参的顺序相匹配? 形参的单位是否和实参匹配?(属逻辑错误) 是否改变了某个仅作为输入值的形参?(C+中的const关键字) 全局变量的定义是否一致?,7.输入输出错误 文件属性是否正确? 打开文件的语句是否正确? 缓冲区、内存大小是否足够来保留程序将读取的文件? 文件在使用前是否打开? 文件在使用后是否关闭了? 文件结束条件是否本正确处理? 是否处理了IO错误? 打印或输出的文本信息中是否存在拼写或语法错误?即输出结果正确性。,针对代码的常见错误列表,针对代码的常见错误列表,8.其他检查 是否存在未引用过的变量? 每个变量的属性和赋予的默
16、认值是否一致? 编译通过的程序是否存在“警告”或“提示”信息? 程序或模块是否对输入的合法性进行了检查?(如三角形的边的合法性) 程序是否遗漏了某个功能?,静态测试-代码走查,走查与代码会审基本相同,其过程分为两步。 (1)把材料先发给走查小组每个成员,让他们认真研究程序,然后再开会。开会的程序与代码会审不同,不是简单地读程序和对照错误检查表进行检查,而是让与会者“充当”计算机。即首先由测试组成员为被测程序准备一批有代表性的测试用例,提交给走查小组。走查小组开会,集体扮演计算机角色,让测试用例沿程序的逻辑运行一遍,随时记录程序的踪迹,供分析和讨论用。 (2)人们借助于测试用例的媒介作用,对程序
17、的逻辑和功能提出各种疑问,结合问题开展热烈的讨论和争议,能够发现更多的问题。,静态测试-评审,它更为正式,且将管理作为它的一个组成部分。审查的目的是为管理者、用户和其他希望开发过程满足适当要求的人提供依据。在评审中,开发人员提供信息以说明开发是按预算和计划进行的,且产生了期望的结果。评审将功能放置在监督级,而不仅仅是技术级。评审更重视产品的质量,而不仅仅是验证其正确性。 评审组常常关注开发策略和开发过程,及合理的假设。评审还验证是否使用了合适的建模方法,以及结果模型的文档是否规范。,静态测试-静态结构分析法,在静态结构分析中,测试人员通常通过使用测试工具分析程序源代码的系统结构、数据结构、数据
18、接口、内部控制逻辑等内部结构,生成函数调用关系图、模块控制流图、内部文件调用关系图等各种图形、图表,清晰地标识整个软件的组成结构。 通过分析这些图表,包括控制流分析、数据据流分析、接口分析、表达式分析等,使其便于阅读与理解,然后可以通过分析这些图表,检查软件有没有存在缺陷或错误。,静态测试-静态结构分析法,静态结构分析法通常采用以下一些方法进行源程序的静态分析: (1) 通过生成各种图表,来帮助对源程序的静态分析 标识符交叉引用表 变量交叉引用表 子程序(宏、函数)引用表 等价表 常数表,静态测试-静态结构分析法,常用的的各种关系图、控制流图主要有: 函数调用关系图:列出所有函数,用连线表示调
19、用关系,通过应用程序各函数之间的调用关系展示了系统的结构。 模块控制流图:由许多结点和连接结点的边组成的图形,其中每个结点代表一条或多条语句,边表示控制流向,可以直观地反映出一个函数的内部结构。,静态测试-静态结构分析法,(2) 错误静态分析 静态错误分析主要用于确定在源程序中是否有某类错误或“危险”结构。 类型分析:数据类型检查 引用分析:变量赋值前使用或赋值后未使用 表达式分析:括号、数组下标、除0、负数开平方等 接口分析:接口的一致性,QAC/QAC+,QAC/QAC+能够对C/C+代码规则进行自动检查,报告所违反的编程标准和准则。通过QAC/QAC+的使用可以减少代码审查所需的时间,使
20、软件设计师在开发阶段的就可以避免代码中的问题,提高代码的质量,缩短后期动态测试的周期。,代码质量度量法,根据ISO/IEC 9126国际标准的定义,软件质量包括以下 六个方面: 功能性(Functionality) 可靠性(Reliability) 可用性 (Usability) 效率 (Efficiency) 可维护性(Maintainability) 可移植性(Portability) 可根据ISO 9126质量模型构造软件的静态质量度量模型,通过量化的数据评估被测程序的质量。,3.2.2 程序插桩技术 在软件动态测试中,程序插桩是一种基本的测试手段,有着广泛的应用。 程序插桩方法是借助往
21、被测程序中插入操作,来实现测试目的的方法,即向源程序中添加一些语句,实现对程序语句的执行、变量的变化等情况进行检查。,问题?,求最大公约数程序每条可执行语句的执行次数?,插桩后求最大公约数程序的流程图,代码插桩方式比较,根据探针插入的时间可以分为目标代码插桩和源代码插桩 。 (1)目标代码插桩的前提是对目标代码进行必要的分析以确定需要插桩的地点和内容。由于目标代码的格式主要和操作系统相关,和具体的编程语言及版本无关,所以得到了广泛的应用,尤其是在需要对内存进行监控的软件中。但是由于目标代码中语法、语义信息不完整,而插桩技术需要对代码词法语法的分析有较高的要求,故在覆盖测试工具中多采用源代码插桩
22、。 (2)源代码插桩是在对源文件进行完整的词法分析和语法分析的基础上进行的,这就保证对源文件的插桩能够达到很高的准确度和针对性。但是源代码插桩需要接触到源代码,使得工作量较大,而且随着编码语言和版本的不同需要做一定的修改。,设计插桩程序时需要考虑的问题包括: 探测哪些信息; 在程序的什么部位设置探测点; 需要设置多少个探测点; 如何在程序中特定部位插入某些用以判断变量特性的语句。,a. 程序的第一条语句;b. 分支语句的开始;c. 循环语句的开始;d. 下一个入口语句之前的语句;e. 程序的结束语句;f. 分支语句的结束;g. 循环语句的结束;除此之外,根据覆盖测试要求的不同,插桩的位置除了上
23、面所说的几种情况外,也会随着覆盖测试要求的不同有所变化。,插桩位置补充,基本块,是指程序顺序执行的语句序列,其中只有一个入口和一个出口,入口就是其中的第个语句,出口就是其中的最后一个语句。对一个基本块来说,执行时只从其入口进入,从其出口退出 基本块的划分 寻找入口语句 1、程序的第一条语句 2、转移语句的目标语句 3、紧跟在条件转移语句后面的语句 划分基本块的算法: 1、求出所有入口语句 2、一个入口语句对应一个基本块,入口语句对应的基本块方法是:该基本块由该入口语句到下一入口语句(不含下一入口语句),或到一转移语句(包括该转移语句),或到一停语句(包括该停语句)之间的代码序列组成 3、凡未被
24、纳入某一基本块的语句,都是程序中控制流程无法到达的语句,可以删除 a. 程序的第一条语句;b. 分支语句的开始;c. 循环语句的开始;d. 下一个入口语句之前的语句;e. 程序的结束语句;f. 分支语句的结束;g. 循环语句的结束,3.2.3 逻辑覆盖 逻辑覆盖也是白盒测试主要的动态测试方法之一,是以程序内部的逻辑结构为基础的测试技术,是通过对程序逻辑结构的遍历实现程序的覆盖,这一方法要求测试人员对程序的逻辑结构有清楚的了解 从覆盖源程序语句的详细程度分析,逻辑覆盖标准有语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖。,语句覆盖,语句覆盖就是设计若干个测试用例,运行被测程序,使得每
25、一可执行语句至少执行一次 语句覆盖的方法似乎能够比较全面地检验每一个可执行语句。但需要注意的是,它是最弱的逻辑覆盖。,语句覆盖,设计若干测试用例,使得程序中每条语句至少被执行一次。,设计原则:测试用例尽量少,覆盖率尽量高,1.语句覆盖续1,只需设计一个测试用例:a=2,b=1,c=6;即达到了语句覆盖。,举例,测试用例设计:,测试用例设计:,测试用例设计:,语句覆盖,优点: 直观、简单、易自动化 缺点: 发现错误能力很“弱” 对隐藏的条件和可能到达的隐式逻辑分支,无法测试,判定覆盖,判定覆盖是指设计测试用例,使得程序中每一个判断的取真分支和取假分支都至少能够执行一次。 不能保证一定能查出在判断
26、的条件中存在的错误,判定覆盖,设计若干测试用例,使得程序中每个判定每个分支至少有一次为真值,有一次为假值,保证程序中的每个分支至少执行一次,2.判定覆盖续1,a=2,b=1 ,c=6可覆盖判断M的Y分支和判断Q的Y分支; a=-2,b=-1 ,c=-3可覆盖判断M的N分支和判断Q的N分支 。 这两组测试用例可覆盖所有判定的真假分支。,判断M,判断Q,2.判定覆盖续2,a=1,b=1 ,c=-3 可覆盖判断M的Y分支和判断Q的N分支 ; a=1,b=-2 ,c=3可覆盖判断M的N分支和判断Q的Y分支 ; 同样的这两组测试用例也可覆盖所有判定的真假分支。,判断M,判断Q,判定覆盖,测试用例设计:,
27、(O),(A),(B),(D),当A=2 B=0 X=3时, 即可满足语句覆盖要求,但abd分支未测试,判定覆盖测试用例:,判定覆盖,测试用例设计:,例3-2,测试用例设计:,判定覆盖,优点: 发现错误能力比语句覆盖强 缺点: 对复合条件判断,只考虑整个判定条件的最终结果,而忽略每个条件的取值情况(若程序中的判定是由几个条件联合构成时,它未必能发现每个条件的错误)必然会遗漏部分测试情况。,条件覆盖,条件覆盖是指设计测试用例,使得程序中每一个判断的每个条件的可能取值至少执行一次。 某些用例可能只覆盖了某个判断的某个分支,不能满足判定覆盖的要求,条件覆盖,设计若干测试用例,使得判定中的每个条件的可
28、能取值至少满足一次。,3.条件覆盖续1,判断M表达式: 设条件 a0 取真 记为 T1 假 F1 条件 b0 取真 记为 T2 假 F2 判断Q表达式: 设条件 a1 取真 记为 T3 假 F3 条件 c1 取真 记为 T4 假 F4,判断M,判断Q,3.条件覆盖续2,它覆盖了判定M的N分支和判断Q的Y分支。,我们用条件覆盖设计的思想就是让测试用例能覆盖 T1、T2、T3、T4、F1、F2、F3、F4,判断M,判断Q,条件覆盖,测试用例设计:,(O),(A),(B),(D),判定覆盖测试用例设计未有B!=0的取值,条件覆盖,条件覆盖测试用例:,测试用例设计:,例3-2,测试用例设计:,条件覆盖
29、,优点: 发现错误能力比语句覆盖强 缺点: 条件覆盖并不能保证判定覆盖。 对复合条件,条件覆盖只能保证每个条件的可能结果至少出现一次,而不考虑所有的判定结果,因此未必能覆盖全部分支。,判定条件覆盖,设计若干测试用例,使得判定中的每个条件的可能取值至少出现一次,且每个判断本身的判定结果也至少出现一次。 实际就是考虑条件覆盖的基础上满足判定覆盖,4.判定条件覆盖续1,按照判定条件覆盖的要求,我们设计的测试用例要满足如下条件: 所有条件可能至少执行一次取值; 所有判断的可能结果至少执行一次。,要满足T1、T2、 T3 、T4 F1、 F2 、F3、F4,4.判定条件覆盖续2,要满足T1、T2、 T3
30、 、T4 F1、 F2 、F3、F4,判定条件覆盖,测试用例设计:,(O),(A),(B),(D),判定条件覆盖,条件覆盖测试用例设计也满足判定条件覆盖的要求:,测试用例设计:,例3-2,测试用例设计:,判定条件覆盖,优点: 发现错误能力比判定覆盖和条件覆盖强 缺点: 不能保证覆盖程序所有执行路径,条件组合覆盖,设计若干测试用例,使得每个判定中条件结果的所有可能组合至少出现一次,5.条件组合覆盖续1,按照条件组合覆盖的基本思想,对于前面的例子,我们把每个判断中的所有条件进行组合,设计组合条件如表所示,而我们设计的测试用例就要包括所有的组合条件。,5.条件组合覆盖续2,要满足1、2、3、4、5、
31、6、7、8条件组合,条件组合覆盖,测试用例设计:,(O),(A),(B),(D),条件组合覆盖,测试用例设计:,理论上最多需要几个测试用例?,测试用例设计:,例3-2,测试用例设计:,条件组合覆盖,优点: 发现错误能力比判定/条件覆盖强 缺点: 不能保证覆盖程序所有执行路径,部分覆盖能力间的关系:,测试覆盖准则,1、错误敏感测试用例分例准则(ESTCA) 2、线性代码序列与跳转覆盖准则(LCSAJ),测试覆盖准则,逻辑覆盖的出发点是合理的、完善的。所谓“覆盖”,就是想要做到全面而无遗漏,但逻辑覆盖并不能真正做到无遗漏。 例如:我们不小心将前面提到的程序段中的 if (x3 V(G)=3个判定结
32、点+1=4。,3. 导出测试用例,导出测试用例,确保基本路径集中的每一条路径的执行。 根据判断结点给出的条件,选择适当的数据以保证某一条路径可以被测试到 用逻辑覆盖方法。,3. 导出测试用例,每个测试用例执行之后,与预期结果进行比较。如果所有测试用例都执行完毕,则可以确信程序中所有的可执行语句至少被执行了一次。 必须注意,一些独立的路径,往往不是完全孤立的,有时它是程序正常的控制流的一部分,这时,这些路径的测试可以是另一条路径测试的一部分。,基本路径测试,基本路径测试法的步骤: (1)以详细或源代码作为基础,导出程序的控制流图。 (2)计算得到控制流图G的环路复杂度V(G) (3)确定基本路径
33、集,生成测试用例,确保基本路径集中每条路径的执行。,基本路径测试案例1,void Sort ( int iRecordNum, int iType ) 1 2 int x=0; 3 int y=0; 4 while ( iRecordNum- 0 ) 5 6 If ( iType=0 ) 7x=y+2;break; 8 else 9 If ( iType=1 ) 10 x=y+10; 11 else 12 x=y+20; 13 14 ,基本路径测试案例1(续),画出控制流图:,void Sort ( int iRecordNum, int iType ) 1 2 int x=0; 3 int
34、y=0; 4 while ( iRecordNum- 0 ) 5 6 If ( iType=0 ) 7x=y+2;break; 8 else 9 If ( iType=1 ) 10 x=y+10; 11 else 12 x=y+20; 13 14 ,基本路径测试案例1(续),计算环形复杂度: 10(条边)- 8(个节点)+ 2 = 4 导出独立路径(用语句编号表示) 路径1:414 路径2:46714 路径3:46910134 路径4:46912134 注:“”表示后面剩下的路径是可以选择的。原因在于存在循环结构。,设计测试用例:,案例2,下例程序流程图描述了最多输入50个值(以1作为输入结束
35、标志),计算其中有效的学生分数的个数、总分数和平均值。,步骤2:确定环形复杂性度量V(G): 1)V(G)= 6 (个区域) 2)V(G)=EN+2=1612+2=6 其中E为流图中的边数,N为结点数; 3)V(G)=P+1=5+1=6 其中P为谓词结点的个数。在流图中,结点2、3、5、6、9是谓词结点。,步骤3:确定基本路径集合(即独立路径集合)。于是可确定6条独立的路径: 路径1:1-2-9-10-12 路径2:1-2-9-11-12 路径3:1-2-3-9-10-12 路径4:1-2-3-4-5-8-2 路径5:1-2-3-4-5-6-8-2 路径6:1-2-3-4-5-6-7-8-2
36、注: “”表示后面剩下的路径是可以选择的。原因在于存在循环结构。,步骤4:为每一条独立路径各设计一组测试用例,以便强迫程序沿着该路径至少执行一次。 1)路径1(1-2-9-10-12)的测试用例:不满足条件2,满足条件9 score1=60; score2=1 期望结果:根据输入的有效分数算出正确的分数个数n1=1、总分sum=60和平均分average=60。,2)路径2(1-2-9-11-12)的测试用例:不满足条件2,不满足条件9 score 1 = 1 ; 期望的结果:average = 1 ,其他量保持初值。,3)路径3(1-2-3-9-10-12)的测试用例:满足条件2,不满足条件
37、3,满足条件9 输入多于50个有效分数,即试图处理51个分数 期望结果:n1=50、且算出正确的总分和平均分。,4)路径4(1-2-3-4-5-8-2)的测试用例:满足条件2,满足条件3,不满足条件5 score1=-0.5;score2=60, score3=-1 ; 期望结果:根据输入的有效分数算出正确的分数个数n1=1、总分sum=60和平均分average=60。,5)路径5(1-2-3-4-5-6-8-2)的测试用例:满足条件2,满足条件3,满足条件5,不满足条件6 score1=101 score2=60, score3=-1 ; 期望结果:根据输入的有效分数算出正确的分数个数n1
38、=1、总分sum=60和平均分average=60。,6)路径6(1-2-3-4-5-6-7-8-2)的测试用例:满足条件2,满足条件3,满足条件5,满足条件6 score1=60, score2=60;score3=-1 ; 期望结果:根据输入的有效分数算出正确的分数个数n1=2、总分sum=120和平均分average=60。,1main () 2 3 int num1=0, num2=0, score=100; 4int i; 5 char str; 6 scanf (“%d, %cn”, 19,案例3,1导出程序控制流图,程序4-2: 1main () 2 3 int num1=0,
39、num2=0, score=100; 4 int i; 5 char str; 6 scanf (“%d, %cn”, 19,2求出程序环形复杂度 根据程序环形复杂度的计算公式,求出程序路径集合中的独立路径数目。 公式1:V(G)=10-8+2,其中10是控制流图G中边的数量,8是控制流图中节点的数目。 公式2:V(G)=3+1,其中3是控制流图G中判断节点的数目。 公式3:V(G)=4,其中4是控制流图G中区域的数目。 因此,控制流图G的环形复杂度是4。就是说至少需要4条独立路径组成基本路径集合,并由此得到能够覆盖所有程序语句的测试用例。,3确定基本路径集及设计测试用例 根据上面环形复杂度的
40、计算结果,源程序的基本路径集合中有4条独立路径: 路径1:7-18 路径2:7-9-10-16-7 路径3:7-9-11-16-7 路径4:7-9-11-13- 14- 16-7 根据上述4条独立路径,设计了测试用例。4个测试用例作为程序输入数据,能够遍历这4条独立路径。,3. 基本路径测试中的图形矩阵工具 图形矩阵是在基本路径测试中起辅助作用的软件工具,利用它可以实现自动地确定一个基本路径集。,流程图,矩阵图,用链接权重替代交叉点值的字母,矩阵就可以成为评估测试中控制结构的有效工具,替换后的矩阵图,1 和 0 表示连接存在, 字母被替换为 1,其他白盒测试方法,域测试 符号测试 Z路径测试
41、程序变异,3.2.6 白盒测试应用策略 以下是各种白盒测试方法的综合应用策略,可供在实际测试应用过程中参考。 (1)在测试中,应尽量先使用工具进行静态结构分析。 (2)测试中可采取先静态后动态的组合方式:先进行静态结构分析、代码检查,再进行覆盖率测试。,(3)利用静态分析的结果作为导引,通过代码检查和动态测试的方式对静态发现结果进行进一步的确认,使测试工作更为有效。 (4)覆盖率测试是白盒测试的重点,一般可使用基本路径测试法达到语句覆盖标准;对于软件的重点模块,应使用多种覆盖率标准衡量代码的覆盖率。,(5)在不同的测试节点,测试的侧重点不同:在单元测试阶段,以代码检查、逻辑覆盖为主;在集成测试
42、阶段,需要增加静态结构分析等;在系统测试阶段,应根据黑盒测试的结果,采取相应的白盒测试。,3.3 黑 盒 测 试 技 术,黑盒测试也称数据驱动测试。 在黑盒测试过程中,只是通过输入数据、进行操作、观察输出结果,来检查软件系统是否按照需求规格说明书的规定正常使用,软件是否能适当地接收输入数据而产生正确的输出信息,并保持外部信息的完整性。,等价类划分,是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取 少数具有代表性的数据作为测试用例。该方法是一种重要的,常用的黑盒测试用例设计方法。,划分等价类: 等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程
43、序中的错误都是等 效的,并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试,因此,可以把全部 输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件就可以用少 量代表性的测试数据取得较好的测试结果。,等价类划分可有两种不同的情况:有效等价类和无 效等价类。 1)有效等价类 是指对于程序的规格说明来说是合理的、有意义的输入数据构成的集合。利用有效等价类可 检验程序是否实现了规格说明中所规定的功能和性能。 2)无效等价类 与有效等价类的定义恰巧相反。无效等价类指对程序的规格说明是不合理的或无意义的输入 数据所构成的集合。对于具体的问题,无效等价类至少应有一个,也可能有
44、多个。 设计测试用例时,要同时考虑这两种等价类。因为软件不仅要能接收合理的数据,也要能经受意 外的考验,这样的测试才能确保软件具有更高的可靠性。,划分等价类的标准: 1)完备测试、避免冗余; 2)划分等价类重要的是:集合的划分,划分为互不相交的一组子集,而子集的并是整个集合; 3)并是整个集合:完备性; 4)子集互不相交:保证一种形式的无冗余性; 5)同一类中标识(选择)一个测试用例,同一等价类中,往往处理相同,相同处理映射到“相 同的执行路径”。 如何划分?先从程序的规格说明书中找出各个输入条件,再为每个输入条件划分两个或多个等价类,形成若干的互不相交的子集。,划分等价类的步骤: (1)先考
45、虑输入数据的类型(合法型和非法型) (2)再考虑数据范围(合法型中的合法区间和非法区间) (3)画出示意图,区分等价类 (4)为每一个等价类编号。 (5)考虑输出,进行补充,划分等价类的方法如下: 按区间划分 按数值划分 按数值集合划分 按限制条件划分 按限制规则划分 按处理方式划分,划分等价类等价类的原则(一)按区间划分,(1) 如果输入条件规定了取值范围,或值的个数,则可以确立一个有效等价类和两个无效等价类。 例如,在程序的规格说明中,对输入条件有一句话: “ 项数可以从1到999 ” 则有效等价类是“1项数999” 两个无效等价类是“项数1”或“项数999”。在数轴上表示成:,例:程序规
46、格说明中提到: “学生允许选修2至4门课” 则有效等价类是“选课2至4门” 两个无效等价类是“只选一门或未选课”和“选课超过4门”。,划分等价类等价类的原则(二)按数值划分,(2) 如果输入条件规定了输入值的集合,或者是规定了“必须如何”的条件,这时可确立一个有效等价类和一个无效等价类。 例如,在Pascal语言中对变量标识符规定为“以字母打头的串”。那么所有以字母打头的构成有效等价类,而不在此集合内(不以字母打头)的归于无效等价类。,划分等价类等价类的原则(三)按数值集合划分,(3) 如果规定了输入数据的一组值,而且程序要对每个输入值分别进行处理。这时可为 每一个输入值确立一个有效等价类,此
47、外针对这组值确立一个无效等价类,它是所有不允许的输入值的集合。 例如,在教师上岗方案中规定对教授、副教授、讲师和助教分别计算分数,做相应的处理。因此可以确定4个有效等价类为教授、副教授、讲师和助教,一个无效等价类,它是所有不符合以上身分的人员的输入值的集合。,划分等价类等价类的原则(四)按限制条件划分,(4) 如果输入条件是一个布尔量,则可以确定一个有效等价类和一个无效等价类。,划分等价类等价类的原则(五)按限制规则划分,(5) 如果规定了输入数据必须遵守的规则,则可以确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。 例如,Pascal语言规定 “一个语句必须以分号;结
48、束”。这时,可以确定一个有效等价类 “以;结束”,若干个无效等价类 “以:结束”、“以,结束”、“以 结束”、“以LF结束”等。,划分等价类等价类的原则(六)按处理方式划分,(6)在确知已划分的等价类中个元素在程序处理中的方式不同的情况下,则应再将该等价类进一步的划分为更小的等价类。,设计测试用例,在确立了等价类后,可建立等价类表,列出所有划分出的等价类输入条件:有效等价类、无 效等价类,然后从划分出的等价类中按以下三个原则设计测试用例: 1)为每一个等价类规定一个唯一的编号; 2)设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖地有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止;
49、3)设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所 有的无效等价类都被覆盖为止。,用等价类划分法设计测试用例的实例 例: 在某一PASCAL语言版本中规定:“标识符是由字母开头,后跟字母或数字的任意组合构成。有效字符数为8个 并且规定:“标识符必须先说明,再使用。” “在同一说明语句中,标识符至少必须有一个。”,用等价类划分的方法,建立输入等价类表:,下面选取了9个测试用例,它们覆盖了所有的等价类。 VAR x,T123a5c7:REAL; BEGIN x := 3.414; T123a5c7 := 2.732; . (1), (2), (3), (4), (5
50、), (6) VAR 2T:REAL; (7) VAR T$:CHAR; (8),VAR GOTO:INTEGER; (9) VAR :REAL; (10) VAR T12345678:REAL; (11) VAR PAR:REAL; (12) BEGIN . PAP := SIN (3.14 * 0.8) / 6; VAR x,:REAL; (13),举例,根据下面给出的规格说明,利用等价类划分的方法,给出足够的测试用例。 “一个程序读入3个整数,把这三个数值看作一个三角形的3条边的长度值。这个程序要打印出信息,说明这个三角形是不等边的、是等腰的、还是等边的。”,分析题目中给出和隐含的对输入
51、条件的要求: 正整数; 三个数; 构成一般三角形; 构成等腰三角形; 构成等边三角形; 不能构成三角形,举例,我们可以设三角形的3条边分别为A,B,C。如果它们能够构成三角形的3条边,必须满足: A0,B0,C0,且A+BC,B+CA,A+CB。 如果是等腰的,还要判断A=B,或B=C,或A=C。 如果是等边的,则需判断是否A=B,且B=C,且A=C。,举例,举例,某城市电话号码由三部分组成。它们的名称和内容分别是: 地区码:空白或三位数字; 前 缀:非0或1的三位数字; 后 缀:4位数字。 假定被测程序能接受一切符合上述规定的电话号码,拒绝所有不符合规定的电话号码。根据该程序的规格说明,作等
52、价类的划分,并设计测试方案。,划分等价类,设计测试用例,例子,1个函数包含3个变量:month、day和year,函数的输出为输入日期后一天的日期。例如,输入为2009年3月30日,则输出为2009年3月31日。要求输入变量month、day和year均为整数值,并满足条件: 1month 12 1 day 31 1920 year 2050,确定等价类表 、设计测试用例,下面选取了7个测试用例,它们覆盖了所有的等价类。 2009.3.30 (1), (2), (5), (6), (9), (10) 2009.0.1; (3) 2009.13.1; (4) 2009.3.0; (7) 2009
53、.3.32; (8) 1919.3.1 (11) 2051.3.1 (12),确立测试用例,186,2. 划分等价类要注意的问题,考虑有效等价类,同时也要考虑无效的等价类。 有效等价类生成的测试用例,可以检验程序是否实现了预先规定的功能和性能。 无效等价类生成的测试用例,可以检查程序中功能和性能的实现是否不符合规格说明要求。 仔细划分,审核划分 等价类的目标就是把所有可能的测试用例组合数量缩减到仍然足以测试软件的范围。 如果为减少测试用例的数量过于粗略地进行等价分配,就会增加漏掉软件缺陷的风险。,187,等价类方法的特点和注意事项,1. 等价类的特点 通过前面的例子可以看出称为等价类数据的共同
54、特点有以下几点: 测试的内容相同。 如果等价类中的一个测试能够捕获一个缺陷,那么选择该等价类中其他测试也能捕获该缺陷。 如果等价类中的一个测试不能捕获缺陷,那么选择该等价类中的其他测试也不能捕获缺陷。,作业,问题描述 程序有三个输入变量month、day、year(month、day和year均为整数值,并且满足:1month12、1day31、1900 year 2050。),分别作为输入日期的月份、日、年份,通过程序可以输出该输入日期在日历上下一天的日期。例如,输入为2005年11月29日,则该程序的输出为2005年11月30日。请用黑盒测试方法设计测试用例。,2.边界值分析法 边界值分析
55、法就是对输入或输出的边界值进行测试的一种黑盒测试方法。 边界值分析法是通过选择等价类边界的测试用例进行测试。 边界值分析法与等价类划分法的区别是边界值分析不是从某等价类中随便挑一个作为代表,而是使这个等价类的每个边界都要作为测试条件。,测试员必须了解的边界,2的幂,测试员必须了解的边界,ASCII码,3. 错误推测法 基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性的设计测试用例的方法,这就是错误推测法。 错误推测法的基本想法是:列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例。,4. 因果图法 因果图法是一种利用图解法分析输入的各种组合情况,从而设计测试
56、用例的方法,它适合于检查程序输入条件的各种组合情况。 因果图方法最终生成的就是判定表。它适合于检查程序输入条件的各种组合情况。,(1) 分析软件规格说明描述中,哪些是原因 (即输入条件或输入条件的等价类),哪些是结果 (即输出条件),并给每个原因和结果赋予一个标识符。(2) 分析软件规格说明描述中的语义,找出原因与结果之间,原因与原因之间对应的是什么关系? 根据这些关系,画出因果图。,用因果图生成测试用例的基本步骤,(3) 由于语法或环境限制,有些原因与原因之间,原因与结果之间的组合情况不可能出现。为表明这些特殊情况,在因果图上用一些记号标明约束或限制条件。(4) 把因果图转换成判定表。(5)
57、 把判定表的每一列拿出来作为依据,设计测试用例。,因果图中使用的基本符号:,在因果图中,用Ci表示原因结点,用Ei表示结果结点。 结点状态,可取值 “0”或“1”。“0”表示某状态不出现,“1”表示某状态出现。 符号包括两类: 表示原因和结果之间关系的符号 表示约束条件的符号,表示原因和结果之间关系的符号:,表示原因和结果之间关系的符号:,1.恒等:表示原因与结果之间一对一的对应关系。若原因出现,则结果出现;若原因不出现,则结果也不出现。 2.非:表示原因与结果之间的一种否定关系。 3.或:表示若几个原因中有一个出现,则结果出现;只有当这几个原因都不出现时,结果才不出现。 4.与:表示若几个原
58、因都出现,结果才出现;若几个原因中有一个不出现,结果就不出现。,表示约束条件的符号:,表示约束条件的符号:,E(互斥):表示a,b两个原因不会同时成立,两个中最多有一个可能成立。 I(包含):表示a或b两个原因中至少有一个必须成立。 O(唯一):表示a,b当中必须有一个,且仅有一个成立。 R(要求):表示当a出现时,b必须也出现。不可能a出现,b不出现。 M(屏蔽):表示当a是1时,b必须是0,而当a为0时,b值不定。,举例:自动饮料售货机,说明:两种饮料:橙汁和啤酒,价格:每杯5角钱; 若投入5角钱或1元钱的硬币,按下橙汁或啤酒的按钮,则相应的饮料就送出来。 若售货机没有零钱找,则显示零钱找
59、完的红灯亮,这时在投入1元硬币并按下按钮后,饮料不送出来,而且1元硬币也退还出来; 若售货机有零钱找,则显示零钱找完的红灯灭,这时在投入1元硬币并按下按钮后,在送出饮料的同时退还5角硬币。,举例:自动饮料售货机,1) 分析这一段说明,列出原因(条件)和结果:原因: 1. 售货机有零钱找 2. 投入1元硬币 3. 投入5角硬币 4. 按下橙汁按钮 5. 按下啤酒按钮 结果:21. 售货机“零钱找完”灯亮 22. 退还1元硬币 23. 退还5角硬币 24. 送出橙汁饮料 25. 送出啤酒饮料,举例:自动饮料售货机,画出因果图。所有原因结点列在左边,所有结果结点列在右边。 建立中间结点,表示中间结果: 11. 投入 1 元硬币且按下按钮 12. 按下橙汁按钮或啤酒按钮 13. 应找 5 角零钱且售货机有零钱找 14. 钱已付清 由于 2 与 3 ,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 内蒙古鄂尔多斯市2026届九年级中考一模数学试卷(含解析)
- 2025年六安霍邱县教育系统引进紧缺人才笔试真题
- 新建500台医药洁净区搬运工业机器人生产线项目可行性研究报告
- 冬季营销活动策划方案(3篇)
- 大型矿山应急预案范文(3篇)
- 品牌战略策划合同范文三篇
- 2026年山东省东营市重点学校高一数学分班考试试题及答案
- 2026年安徽中考数学考试真题附答案
- 2026年黑龙江中考(地生会考)考试试卷真题(含答案)
- 2026年山东省泰安市重点学校高一英语分班考试试题及答案
- 【新教材】2026年秋季统编版九年级上册道德与法治第一单元 坚持党的全面领导 考点速记+练习题(含答案)
- 2026年完整三支一扶考试真题解析试卷及答案
- 2026教案自查报告(2篇)
- 高考考前必背核心要点(核心知识)-2026年高考生物二轮复习
- 免疫检查点抑制剂特殊人群应用专家共识
- 低压电工资格证考试题库(2026年版适配应急管理部考核标准)
- 护理部行风管理工作制度
- 2026年安徽省新版基层法律工作试卷及答案
- 2025-2030中国电容式液位变送器行业市场现状供需分析及投资评估规划分析研究报告
- 酒驾查处流程
- DB51∕T 2428-2017 高速公路施工标准化技术指南
评论
0/150
提交评论