收藏 分享(赏)

软件测试第03章.ppt

上传人:11xg27ws 文档编号:6010070 上传时间:2019-03-24 格式:PPT 页数:251 大小:5.27MB
下载 相关 举报
软件测试第03章.ppt_第1页
第1页 / 共251页
软件测试第03章.ppt_第2页
第2页 / 共251页
软件测试第03章.ppt_第3页
第3页 / 共251页
软件测试第03章.ppt_第4页
第4页 / 共251页
软件测试第03章.ppt_第5页
第5页 / 共251页
点击查看更多>>
资源描述

1、第3章 软件测试基本技术,3.1 黑盒测试与白盒测试 3.2 白 盒 测 试技术 3.3 黑 盒 测 试技术,3.1 黑盒测试与白盒测试,任何工程产品都可以使用白盒测试和黑盒测试两种方法之一进行测试。 1黑盒测试黑盒测试:在测试时,把被测程序视为一个不能打开的黑盒子,完全不考虑程序的内部结构和内部特性下进行的测试。已知产品的功能设计规格和用户手册,可以进行测试证明每个功能是否实现、每个实现了的功能是否符合要求,以及产品的性能是否满足用户的要求。,黑盒测试的过程,黑盒测试主要是为了发现以下几类错误:1. 是否有不正确或遗漏的功能? 2. 在接口上,输入是否能正确的接受?能否输出正确的结果? 3.

2、 是否有数据结构错误或外部信息(例如数据文件)访问错误? 4. 性能上是否能够满足要求? 5. 是否有初始化或终止性错误?,黑盒测试的优缺点,优点: 1、 简单,不需要了解程序的内部结构 2、与软件的内部实现无关 3、从用户角度出发,能很容易知道用户会用到哪些功能,遇到哪些问题 4、基于说明书,知道软件实现了说明书哪些功能 5、采用自动化测试,较为方便 缺点: 1、不可能覆盖所有的代码 2、不能测试程序内部特定部位 3、程序中代码未执行的代码无法发现错误 4、无法发现说明书本身存在问题的问题,2白盒测试白盒测试:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部

3、成分是否以经过检查。软件的白盒测试是对软件的过程性细节做细致的检查,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。,白盒测试过程,白盒测试须对程序模块进行如下检查:1. 保证一个模块中的所有独立路径至少被使用一次2. 对所有逻辑值均测试true和false。3. 在循环的边界和运行的界限内执行循环体。 4. 检查内部数据结构以确定其有效性。,白盒测试优缺点,优点: 1、迫使测试人员去了解软件的实现 2、 检测代码中的每条路径和分支 3、揭示隐藏

4、在代码中的错误 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人组成最佳)协调人、编码人员、模块的设计人员、一名测试专家 协调人职责 为代码审查分发材料(程序清单、设计规范),安排进程 在代码审查过程中起主导作用 记录发现的所有错误 确保所有错误随后得到改正,静态测试-代码审查和走查,代码审查过程: (1)

9、协调人提前把代码审查常见错误列表、设计规格说明书、控制流程图、程序文本及有关要求、规范等分发给小组成员,作为评审的依据。小组成员在充分阅读这些材料之后,进入审查的第二步。 常见错误列表:把以往所有可能发生的常见错误罗列出来,供与会者对照检查,以提高会审的实效。这个常见错误清单也叫做检查表,它把程序中可能发生的各种错误进行分类,对每一类列举出尽可能多的典型错误,然后把它们制成表格,供在会审时使用。,静态测试-代码审查和走查,代码审查过程: (2)召开程序审查会。在会上,首先由程序员逐句讲解程序的逻辑。在此过程中,程序员或其他小组成员可以提出问题,展开讨论,审查错误是否存在。实践表明,程序员在讲解

10、过程中能发现许多原来自己没有发现的错误,而讨论和争议则促进了问题的暴露。,协调人要确保会议高效进行,参与者将注意力用于查找错误而不是修正错误。修正错误由程序员在会后完成。,会议结束后,程序员得到一份已发现错误清单。如果错误太多或程序要做根本改动,协调人可以再安排一次审查。,静态测试-代码审查和走查,会议理想时间为90-120分钟。时间越长,效率越低。 审查按150行/小时速度进行。 每次会议审查一个或几个模块或子程序。 为了使每个人都采取建设性态度,最好对审查结果进行保密,仅限于参与者内部。如果让管理人员做为考评依据,则与检查过程的目的背道而驰。,静态测试-代码检查和走查,代码审查常见错误列表

11、(1) 检查代码和设计的一致性;(2) 代码的可读性以及对软件设计标准的遵循情况;(3) 代码逻辑表达的正确性;(4) 代码结构的合理性;(5) 程序中不安全、不明确和模糊的部分;(6) 编程风格方面的问题等。,静态测试-常见错误列表,针对代码的常见错误列表 数据引用错误 数据声明错误 运算错误 比较错误 控制流程错误 接口错误 输入输出错误 其它检查,针对代码的常见错误列表,1.数据引用错误 变量使用前是否赋值或初始化?容易引起变量使用错误,特别是对于指针或引用变量。在java中要求变量在使用前必须初始化。 数组下标的范围和类型是否存在下标越界错误,下表类型是否为整型。 通过指针引用的内存单

12、元是否存在(虚调用)?如在函数返回局部变量的指针或引用时会产生虚调用错误。 被引用的变量或内存的属性是否与编译器预期的一致?如A类型的指针或引用是否指向的是非A类型对象。,针对代码的常见错误列表,2.数据声明错误 是否所有变量都已声明?绝大多数编程语言要求变量先定义后使用,可保证变量使用的安全性。 默认的属性(默认值)是否正确? 变量的初始化是否正确?变量的初始化是否与其存储空间的类型一致? 是否每个变量都有正确的长度、类型和存储类别? 是否存在相似名称的变量?,3.运算错误 是否存在非算术变量之间的运算? 是否存在混合模式的运算?( int与float类型,例) 是否存在不同字长变量之间的运

13、算?(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)目标代码插桩的前提是对目标代码进行必要的分析以确定需要插桩的地点和内容。由于目标代码的格式主要和操作系统相关,和具体的编程语言及版本无关,所以得到了广泛的应用,尤其是在需要对内存进行监控的软件中。但是由于目标代码中语法、语义信息不完整,而插桩技术需要对代码词法语法的分析有较高的要求,故在覆盖测试工具中多采用源代码插桩。 (2)源代码插桩是在对源文件进行完整的词法分析和语法分析的基础上进行的,这就

22、保证对源文件的插桩能够达到很高的准确度和针对性。但是源代码插桩需要接触到源代码,使得工作量较大,而且随着编码语言和版本的不同需要做一定的修改。,设计插桩程序时需要考虑的问题包括: 探测哪些信息; 在程序的什么部位设置探测点; 需要设置多少个探测点; 如何在程序中特定部位插入某些用以判断变量特性的语句。,a. 程序的第一条语句;b. 分支语句的开始;c. 循环语句的开始;d. 下一个入口语句之前的语句;e. 程序的结束语句;f. 分支语句的结束;g. 循环语句的结束;除此之外,根据覆盖测试要求的不同,插桩的位置除了上面所说的几种情况外,也会随着覆盖测试要求的不同有所变化。,插桩位置补充,基本块,

23、是指程序顺序执行的语句序列,其中只有一个入口和一个出口,入口就是其中的第个语句,出口就是其中的最后一个语句。对一个基本块来说,执行时只从其入口进入,从其出口退出 基本块的划分寻找入口语句 1、程序的第一条语句 2、转移语句的目标语句 3、紧跟在条件转移语句后面的语句 划分基本块的算法: 1、求出所有入口语句 2、一个入口语句对应一个基本块,入口语句对应的基本块方法是:该基本块由该入口语句到下一入口语句(不含下一入口语句),或到一转移语句(包括该转移语句),或到一停语句(包括该停语句)之间的代码序列组成 3、凡未被纳入某一基本块的语句,都是程序中控制流程无法到达的语句,可以删除a. 程序的第一条

24、语句;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,判定覆盖,测试用例设计:,(O),(A),(B),(D),当A=2 B=0 X=3时, 即可满足语句覆盖要求,但abd分支

27、未测试,判定覆盖测试用例:,判定覆盖,测试用例设计:,例3-2,测试用例设计:,判定覆盖,优点:发现错误能力比语句覆盖强 缺点:对复合条件判断,只考虑整个判定条件的最终结果,而忽略每个条件的取值情况(若程序中的判定是由几个条件联合构成时,它未必能发现每个条件的错误)必然会遗漏部分测试情况。,条件覆盖,条件覆盖是指设计测试用例,使得程序中每一个判断的每个条件的可能取值至少执行一次。 某些用例可能只覆盖了某个判断的某个分支,不能满足判定覆盖的要求,条件覆盖,设计若干测试用例,使得判定中的每个条件的可能取值至少满足一次。,3.条件覆盖续1,判断M表达式:设条件 a0 取真 记为 T1 假 F1条件

28、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 、T4 F1、 F2 、F3、F4,判定条件覆盖,测试用例设计:,(O),(A),(B),(D),判定条件覆盖

30、,条件覆盖测试用例设计也满足判定条件覆盖的要求:,测试用例设计:,例3-2,测试用例设计:,判定条件覆盖,优点:发现错误能力比判定覆盖和条件覆盖强 缺点:不能保证覆盖程序所有执行路径,条件组合覆盖,设计若干测试用例,使得每个判定中条件结果的所有可能组合至少出现一次,5.条件组合覆盖续1,按照条件组合覆盖的基本思想,对于前面的例子,我们把每个判断中的所有条件进行组合,设计组合条件如表所示,而我们设计的测试用例就要包括所有的组合条件。,5.条件组合覆盖续2,要满足1、2、3、4、5、6、7、8条件组合,条件组合覆盖,测试用例设计:,(O),(A),(B),(D),条件组合覆盖,测试用例设计:,理论

31、上最多需要几个测试用例?,测试用例设计:,例3-2,测试用例设计:,条件组合覆盖,优点:发现错误能力比判定/条件覆盖强 缺点:不能保证覆盖程序所有执行路径,部分覆盖能力间的关系:,测试覆盖准则,1、错误敏感测试用例分例准则(ESTCA) 2、线性代码序列与跳转覆盖准则(LCSAJ),测试覆盖准则,逻辑覆盖的出发点是合理的、完善的。所谓“覆盖”,就是想要做到全面而无遗漏,但逻辑覆盖并不能真正做到无遗漏。 例如:我们不小心将前面提到的程序段中的 if (x3 & Z=3 & Z10) 按照我们前面设计的测试用例(x的值取2或4)来看,逻辑覆盖对这样的小问题都无能为力。分析出现这一情况的原因在于:错

32、误区域仅仅在x=3这个点上,即仅当x的值取3时,测试才能发现错误。面对这类情况,我们应该从中吸取的教训是测试工作要有重点,要多针对容易发生问题的地方设计测试用例。,测试覆盖准则,1、错误敏感测试用例分例准则(ESTCA) 2、线性代码序列与跳转覆盖准则(LCSAJ),ESTCA,规则1 对于A rel B(rel可以是 )型的分支谓词,应适当地选择A与B的值,使得测试执行到该分支语句时,A B的情况分别出现一次。 规则2 对于A rel1 C(rel1可以是 或是 时,应适当地选择A,使:A = C + M。 规则3 对外部输入变量赋值,使其在每一测试用例中均有不同的值与符号,并与同一组测试用

33、例中其它变量的值与符合不一致。,ESTCA,ESTCA覆盖准则:在容易发生问题的地方设计测试用例,即重视程序中谓词(条件判断)的取值。 ESTCA覆盖准则是一套错误敏感用例分析规则。这一规则虽然并不完备,但在普通程序中却是有效的。原因在于这是一种经验型的覆盖准则,规则本身针对了程序编写人员容易发生的错误,或是围绕着发生错误的频繁区域,从而提高了发现错误的命中率。,LCSAJ,关于LCSAJLCSAJ (Linear Code Sequence and Jump) 的字面含义是线性代码序列与跳转。在程序中,一个LCSAJ是一组顺序执行的代码,以控制跳转为其结束点。 LCSAJ的起点是根据程序本身

34、决定的。它的起点可以是程序第一行或转移语句的入口点,或是控制流可跳达的点。 如果有几个LCSAJ首尾相接,且第一个LCSAJ起点为程序起点,最后一个LCSAJ终点为程序终点,这样的LCSAJ串就组成了程序的一条路径(LCSAJ路径)。一条LCSAJ程序路径可能是由2个、3个或多个LCSAJ组成的。,LCSAJ,An LCSAJ is a software code path fragment consisting of a sequence of code (a linear code sequence) followed by a control flow Jump, and consist

35、s of the following three items:61:the start of the linear sequence of executable statements 2:the end of the linear sequence 3:the target line to which control flow is transferred at the end of the linear sequence.,3.2.4 基本路径测试法基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出基本可执行路径集合,从而设计测试用例的方法。设计出的测试用例要保证在测

36、试中程序的每一条可执行语句至少执行一次。,基本路径测试-续,路径测试就是从一个程序的入口开始,执行所经历的各个语句的完整过程。从广义的角度讲,任何有关路径分析的测试都可以被称为路径测试。 完成路径测试的理想情况是做到路径覆盖,但对于复杂性大的程序要做到所有路径覆盖是不可能的。,路径测试的例子,(3,0,3) (1,1,1) (1,1,3) (2,0,1),基本路径测试,在不能做到所有路径覆盖的前提下,如果某一程序的每一个独立路径都被测试过,那么可以认为程序中的每个语句都已经检验过了。这种测试方法就是通常所说的基本路径测试法。,基本路径测试,基本路径测试方法是在控制流图的基础上,通过分析控制结构

37、的环形复杂度,导出执行路径的基本集,再从该基本集设计测试用例。基本路径测试方法包括4个步骤:,基本路径测试,(1)画出程序的控制流图。 (2)计算程序的环形复杂度,导出程序基本路径集中的独立路径条数,这是确定程序中每个可执行语句至少执行一次所必须的测试用例数目的上界。 (3)导出基本路径集,确定程序的独立路径。 (4)根据(3)中的独立路径,设计测试用例的输入数据和预期输出,控制流图,程序流程图又称框图,是我们最熟悉,也是最容易理解的一种程序控制结构的图形表示了。在这种图上的框里面常常标明了处理要求或者条件,但是,这些标注在做路径分析时是不重要的。为了更加突出控制流的结构,需要对程序流程图做一

38、些简化。,在控制流图中只有两种图形符号,它们是: 节点:以标有编号的圆圈表示。 控制流线或弧:以箭头表示。,1. 程序的控制流图,节点1、标有编号的圆圈 2、程序流程图中矩形框所表示的处理 3、菱形表示的两个甚至多个出口判断 4、多条流线相交的汇合点,1. 程序的控制流图,1. 程序的控制流图,控制流线或弧 1、箭头 2、与程序流程图中的流线一致,表 明了控制的顺序 3、控制流线通常标有名字,常见结构的流程图与控制流图,1. 程序的控制流图,在选择或多分支结构中,分支的汇聚处应有一个汇聚节点。 边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。,控制流图实例,其中,包含

39、条件的节点被称为判定节点(也叫谓词节点),由判定节点发出的边必须终止于某一个节点,由边和节点所限定的范围被称为区域。,1. 程序的控制流图,1. 程序的控制流图,区域,1. 程序的控制流图,复合条件的控制流图如果判断中的条件表达式是由一个或多个逻辑运算符 (OR, AND, .) 连接的复合条件表达式,则需改为 一系列只有单个条件的嵌套的判断。,1. 程序的控制流图,1. 程序的控制流图,2. 程序环路复杂性,环路复杂性即McCabe复杂性度量,在进行程序的基本路径测试时,从程序的环路复杂性可导出程序基本路径集合中的独立路径条数。 程序的环路复杂性给出了程序基本路径集中的独立路径条数,这是确保

40、程序中每个可执行语句至少执行一次所必需的测试用例数目的上界。,2. 程序环路复杂性,独立路径:指包括一组以前没有处理的语句或条件的一条路径。 从控制流图来看,一条独立路径是至少包含有一条在其它独立路径中从未有过的边的路径。 一条路径这里指一条“程序通路”。,思考:根据独立路径的定义,在图示的控制流图中,有哪些独立的路径?,2. 程序环路复杂性,2. 程序环路复杂性,path1:1 - 11 path2:1 - 2 - 3 - 4 - 5 - 10 - 1 - 11 path3:1 - 2 - 3 - 6 - 8 - 9 - 10 - 1 - 11 path4:1 - 2 - 3 - 6 - 7

41、 - 9 - 10 - 1 - 11 路径 path1,path2,path3,path4组成了控制流图的一个基本路径集。,2. 程序环路复杂性,程序环路复杂性计算方法(三种): (1)流图中区域的数量对应于环形复杂度 (2)给定流图G的环形复杂度V(G),定义为V(G)=E-N+2, E是流图中边的数量,N是流图中节点的数量。 (3) V(G)=P+1, P是流图G中的判定节点数。,2. 程序环路复杂性,图中的圈复杂度,计算如下: 流图中有四个区域; V(G)=10条边-8结点+2=4; V(G)=3个判定结点+1=4。,3. 导出测试用例,导出测试用例,确保基本路径集中的每一条路径的执行。

42、 根据判断结点给出的条件,选择适当的数据以保证某一条路径可以被测试到 用逻辑覆盖方法。,3. 导出测试用例,每个测试用例执行之后,与预期结果进行比较。如果所有测试用例都执行完毕,则可以确信程序中所有的可执行语句至少被执行了一次。 必须注意,一些独立的路径,往往不是完全孤立的,有时它是程序正常的控制流的一部分,这时,这些路径的测试可以是另一条路径测试的一部分。,基本路径测试,基本路径测试法的步骤: (1)以详细或源代码作为基础,导出程序的控制流图。 (2)计算得到控制流图G的环路复杂度V(G) (3)确定基本路径集,生成测试用例,确保基本路径集中每条路径的执行。,基本路径测试案例1,void S

43、ort ( int iRecordNum, int iType ) 1 2 int x=0; 3 int y=0; 4 while ( iRecordNum- 0 ) 5 6 If ( iType=0 ) 7 x=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 y=0; 4 while ( iRecordNum- 0 ) 5 6 If ( i

44、Type=0 ) 7 x=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作为输入结束标志),计算其中有效的学生分数的个数、总分数和平均值。,步骤2:确定环形复杂性度量V(G

45、): 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注: “”表示后面剩下的路径是可以选择的。原因在于存在循环结构。,步骤4:为每一条独立路径各

46、设计一组测试用例,以便强迫程序沿着该路径至少执行一次。 1)路径1(1-2-9-10-12)的测试用例:不满足条件2,满足条件9score1=60;score2=1 期望结果:根据输入的有效分数算出正确的分数个数n1=1、总分sum=60和平均分average=60。,2)路径2(1-2-9-11-12)的测试用例:不满足条件2,不满足条件9score 1 = 1 ;期望的结果:average = 1 ,其他量保持初值。,3)路径3(1-2-3-9-10-12)的测试用例:满足条件2,不满足条件3,满足条件9 输入多于50个有效分数,即试图处理51个分数 期望结果:n1=50、且算出正确的总分

47、和平均分。,4)路径4(1-2-3-4-5-8-2)的测试用例:满足条件2,满足条件3,不满足条件5score1=-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,不满足条件6score1=101score2=60,score3=-1 ; 期望结果:根据输入的有效分数算出正确的分数个数n1=1、总分sum=60和平均分average=60。,6)路径6(1-2-3-4-5-6-7-8-2)的测试

48、用例:满足条件2,满足条件3,满足条件5,满足条件6score1=60, score2=60;score3=-1 ; 期望结果:根据输入的有效分数算出正确的分数个数n1=2、总分sum=120和平均分average=60。,1 main () 2 3 int num1=0, num2=0, score=100; 4 int i; 5 char str; 6 scanf (“%d, %cn”, 19 ,案例3,1导出程序控制流图,程序4-2: 1 main () 2 3 int num1=0, num2=0, score=100; 4 int i; 5 char str; 6 scanf (“%

49、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确定基本路径集及设计测试用例 根据上面环形复杂度的计算结果,源程序的基本路径集合中有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条独立路径。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 社会民生

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报