1、1第七章 实现(编码与测试)Implementation=Coding+Testing实现:编码与测试问题定义可行性研究需求分析总体设计详细设计编码与单元测试编码与单元测试综合测试综合测试软件维护软件定义时期软件开发时期软件维护时期将软件设计的结果转化成程序设计语言编写的计算机程序。开发人员对软件的最小设计单位-模块进行单元测试。熟悉软件测试的步骤:单元测试、集成测试、确认测试。掌握软件测试的方法:白盒测试、黑盒测试、灰盒测试。掌握软件调试(纠错)的方法:调试过程、调试方法。了解软件可靠性基本概念及估算方法。第七章 实现(编码与测试)7.1 编码 7.2 软件测试基础 7.3 单元测试 7.4
2、 集成测试 7.5 确认测试 7.6 白盒测试技术 7.7 黑盒测试技术 7.8 调试 7.9 软件可靠性37.1 编码 编码就是把软件设计结果翻译成用某种程序设计语言书写的程序。7.1.1 选择程序设计语言 7.1.2 编码风格 1.程序内部的文档 2.数据说明 3.语句构造 4.输入输出 5.效率7.1.1 选择程序设计语言 为什么 程序设计语言是人和计算机通信的最基本的工具,它的特点必然会影响人的思维和解题方式,会影响人和计算机通信的方式和质量,也会影响其他人阅读和理解程序的难易程度。因此,编码之前的一项重要工作就是选择一种适当的程序设计语言。实用选择标准:用户对编程语言的要求。可以使用
3、的编译程序。可以得到的软件工具。工程规模。程序员的编程语言知识。软件可移植性要求。软件的应用领域。效率:阅读理解、开发、测试、运行、维护7.1.2 编码风格 程序实际上也是一种供人阅读的文章,应该使程序具有良好的风格。“好的”程序应遵循的规则:程序文档:源程序文档化,易于理解的标识符命名、适当的注释、清晰的程序视觉组织等。数据说明:易于理解,便于查阅。语句构造:结构化,简单、直观,技巧不过份。输入输出:遵循人机界面设计准则。效率:效率满足需求;不要为了追求效率而过份使用技巧,牺牲程序的清晰性、可读性。(1)程序文档 程序中的标识符(名字)程序中的注释 程序的视觉组织 符号名的命名 符号名 即标
4、识符,包括模块名、变量名、常量名、标号名、子程序名、数据区名以及缓冲区名等。名字的意义 这些名字应能反映它所代表的实际东西,应有一定实际意义。例如,表示次数的量用Times,表示总量的用Total,表示平均值的用Average,表示和的量用Sum等。名字的使用 名字不是越长越好,应当选择精炼的意义明确的名字。必要时可使用缩写名字,但这时要注意缩写规则要一致。要给每一个名字加注释。在一个程序中,一个变量只应用于一种用途。夹在程序中的注释是程序员与夹在程序中的注释是程序员与日后日后的程序读者的程序读者之间之间通信的重要手段通信的重要手段。注释注释决不是可有可无决不是可有可无的。的。一些正规的程序文
5、本中,注释行的数量占到整一些正规的程序文本中,注释行的数量占到整个源程序的个源程序的1/31/3到到1/21/2,甚至更多。,甚至更多。注释分为注释分为序言性注释序言性注释和和功能性注释功能性注释。程序的注释 序言性注释通常置于每个程序模块的开头部分,序言性注释通常置于每个程序模块的开头部分,它应当给出程它应当给出程序的整体说明序的整体说明,对于理解程序本身具有引导作用。,对于理解程序本身具有引导作用。序言性注释包括:序言性注释包括:程序标题程序标题;有关本模块有关本模块功能和目的功能和目的的的说明说明;主要算法说明:算法概要、大意主要算法说明:算法概要、大意;接口说明接口说明:包括调用形式,
6、参数描述,子程序清单;:包括调用形式,参数描述,子程序清单;有关数据描述有关数据描述:重要的变量及其用途,约束或限制条件,:重要的变量及其用途,约束或限制条件,以及其它有关信息;以及其它有关信息;模块位置模块位置:在哪一个源文件中,或隶属于哪一个软件包;:在哪一个源文件中,或隶属于哪一个软件包;开发简历开发简历:模块设计者,复审者,复审日期,修改日期及:模块设计者,复审者,复审日期,修改日期及有关说明等。有关说明等。序言性注释 功能性注释嵌在源程序体中,用以描述其后的语句或程序段是功能性注释嵌在源程序体中,用以描述其后的语句或程序段是在做什么工作,或是执行了下面的语句会怎么样,而不要解释在做什
7、么工作,或是执行了下面的语句会怎么样,而不要解释下面怎么做。下面怎么做。要点要点 描述一段程序,而不是每一个语句;描述一段程序,而不是每一个语句;用缩进和空行,使程序与注释容易区别;用缩进和空行,使程序与注释容易区别;注释要正确。注释要正确。例如:例如:/*ADD AMOUNT TO TOTAL ADD AMOUNT TO TOTAL*/TOTAL=AMOUNT TOTAL=AMOUNTTOTALTOTAL 上面注视不清楚,如果注明把月销售额计入年度总额,便使读者理解了上面注视不清楚,如果注明把月销售额计入年度总额,便使读者理解了下面语句的意图:下面语句的意图:/*ADD MONTHLY-SA
8、LES TO ANNUAL-TOTAL ADD MONTHLY-SALES TO ANNUAL-TOTAL*/TOTAL=AMOUNT TOTAL=AMOUNTTOTALTOTAL功能性注释 恰当地利用恰当地利用空格空格,可以,可以突出运算的优突出运算的优先性先性,避免发生运算的错误。例如,避免发生运算的错误。例如 ,将表达式将表达式 (A A17)17)ANDNOTANDNOT(B B49)49)ORCORC写成写成 (A A17)17)AND NOTAND NOT(B B49)49)OR COR C 自然的程序段之间可用自然的程序段之间可用空行空行隔开;隔开;移行移行也叫做也叫做向右缩格向
9、右缩格。它是指程序中。它是指程序中的各行不必都在左端对齐,都从第一的各行不必都在左端对齐,都从第一格起排列。这样做使程序完全分不清格起排列。这样做使程序完全分不清层次关系。层次关系。对于对于选择语句选择语句和和循环语句循环语句,把其中的,把其中的程序段语句向右做程序段语句向右做阶梯式移行阶梯式移行。使程。使程序的逻辑结构更加清晰。序的逻辑结构更加清晰。例如,两重选择结构嵌套写成下面的移行形式,层次就清楚得多。IF()THEN IF()THEN ELSE ENDIF ELSE ENDIF 视觉组织:使用空格、空行和移行 数据说明指程序中用到的常量、变量、文件等数据对象的定义。在设计阶段已经确定了
10、数据结构的组织及其复杂性。在编写程序时,则需要注意数据说明的风格。为了使程序中数据说明更易于理解和维护,必须注意以下几点:a.数据说明的次序应该标准化。有次序易查阅,能加速测试、调试和维护的过程。b.当多个变量名在一个语句中说明时,应该按字母顺序排列这些变量。c.如果设计时使用了一个复杂的数据结构,则应该用注解说明用程序设计语言实现这个数据结构的方法和特点。(2)数据说明数据说明的次序 数据说明常量说明 简单变量类型说明 数组说明 公用数据块说明 所有的文件说明 数据类型说明 整型量说明 实型量说明 字符量说明 逻辑量说明数据说明数据说明有次序易查阅,能加速测试、调试和维护的过程。有次序易查阅
11、,能加速测试、调试和维护的过程。变量名按字母顺序排列 b.当多个变量名在一个语句中说明时,应该按字母顺序排列这些变量,便于查找。例如,把integer size,length,width,cost,price 写成 (3)语句构造AI=AIAT;AT=AIAT;AI=AIAT;WORK=AT;AT=AI;AI=WORK;构造语句时应该遵循的原则是,每个语句都应该简单而直接,不能为了提高效率而使程序变得过分复杂;也功能:AT与AI交换数据值未使用中间变量难懂使用中间变量清晰例:语句构造功能:初始化对角单位矩阵1 0 0 00 1 0 00 0 1 0.0 0 0 1 有助于使语句简单明了的规则
12、不要为了节省空间而把多个语句写在同一行;尽量避免复杂的条件测试;尽量减少对“非”条件的测试;避免大量使用循环嵌套和条件嵌套;利用括号使逻辑表达式或算术表达式的运算次序清晰直观。例:使用not(!)操作的例子将 if(!(char0|char 9)改成 if(char=0&char 1)AND(B=0)(A=2)OR(X1)返回返回X=X/AX=X+1FFTTabdce只需设计一个测试用例只需设计一个测试用例:输入数据:输入数据:A=2,B=0,X=4 即达到了语句覆盖。即达到了语句覆盖。语句覆盖是语句覆盖是最弱最弱的逻辑覆盖的逻辑覆盖(如:(如:AND AND 写成写成 OROR,X1 写成写
13、成 X 1)AND(B=0)(A=2)OR(X1)返回返回X=X/AX=X+1FFTTabdce可设计两组测试用例可设计两组测试用例:A=3,B=0,X=3 可覆盖可覆盖c、d分支分支 A=2,B=1,X=1 可覆盖可覆盖b、e分支分支 两组测试用例可覆盖所有两组测试用例可覆盖所有判定的真假分支判定的真假分支 判定覆盖仍是判定覆盖仍是弱弱的逻辑覆的逻辑覆盖,只覆盖了全部路径的盖,只覆盖了全部路径的一半。一半。773、条件覆盖 使每个判定的每个条件的可能取值至少执行一次。开始开始(A1)AND(B=0)(A=2)OR(X1)返回返回X=X/AX=X+1FFTTabdce满足条件满足条件:T1,T
14、1,T2,T2 T3,T3 T4,T4第一判定表达式第一判定表达式:设条件设条件 A1 A1 取真取真 记为记为T1T1 假假 T1T1 条件条件 B=0 B=0 取真取真 记为记为T2T2 假假 T2T2第二判定表达式第二判定表达式:设条件设条件 A=2 A=2 取真取真 记为记为T3T3 假假 T3T3 条件条件 X1 X1 取真取真 记为记为T4T4 假假 T4T478测试用例测试用例 通过通过 满足的满足的 覆盖覆盖A B X 路径路径 条件条件 分支分支1 0 3 abe T1,T2,T3,T4 b,e2 1 1 abe T1,T2,T3,T4 b,e 两个测试用例覆盖了四个条件八种
15、可能取值。两个测试用例覆盖了四个条件八种可能取值。未覆盖未覆盖c、d分支,不满足判定覆盖的要求分支,不满足判定覆盖的要求.条件覆盖不一定包含判定覆盖条件覆盖不一定包含判定覆盖 判定覆盖也不一定包含条件覆盖判定覆盖也不一定包含条件覆盖(A1)AND(B=0)(A=2)OR(X1)X=X/AX=X+1FFTTabdce794.判定/条件覆盖 选取足够多的测试用例,使判断中的每个条件的所有可能取值至少执行一次,同时每个判断本身的所有可能判断结果至少执行一次.开始开始(A1)AND(B=0)(A=2)OR(X1)返回返回X=X/AX=X+1FFTTabdce满足条件满足条件:T1,T1,T2,T2 T
16、3,T3 T4,T480测试用例测试用例 通过通过 满足的条件满足的条件 覆盖覆盖A B X 路径路径 分支分支2 0 4 ace T1,T2,T3,T4 c,e1 1 1 abd T1,T2,T3,T4 b,d能同时满足判定、条件两种覆盖标准的取值能同时满足判定、条件两种覆盖标准的取值 5、条件组合覆盖、条件组合覆盖所有可能的条件取值组合至少执行一次所有可能的条件取值组合至少执行一次 A1,B=0 A1,B0 A 1,B=0 A 1,B0 A=2,X1 A=2,X 1 A2,X1 A2,X 1测试用例测试用例 通过通过 满足的满足的 覆盖覆盖A B X 路径路径 条件条件 分支分支2 0 4
17、 ace T1,T2,T3,T4 c,e2 1 1 abe T1,T2,T3,T4 b,e1 0 2 abd T1,T2,T3,T4 b,d1 1 1 abd T1,T2,T3,T4 b,d(A1)AND(B=0)(A=2)OR(X1)X=X/AX=X+1FFTTabdce82 以上根据测试数据对源程序以上根据测试数据对源程序语句检测语句检测的详的详尽程度,简单讨论了几种逻辑覆盖标准。在上尽程度,简单讨论了几种逻辑覆盖标准。在上面的分析过程中常常谈到测试数据执行的程序面的分析过程中常常谈到测试数据执行的程序路径,显然,测试数据可以检测的程序路径的路径,显然,测试数据可以检测的程序路径的多少,也
18、反映了对程序测试的详尽程度。从对多少,也反映了对程序测试的详尽程度。从对程序路径的覆盖程度程序路径的覆盖程度分析,能够提出下述一些分析,能够提出下述一些主要的逻辑覆盖标准。主要的逻辑覆盖标准。语句覆盖法评述836.点覆盖 图论中点覆盖的概念定义如下:如果连通图如果连通图G G的子图的子图GG是连通的,而且包含是连通的,而且包含G G的所的所有结点,则称有结点,则称GG是是G G的点覆盖。的点覆盖。在第5章中已经讲述了从程序流程图导出流图的方法。在正常情况下流图是连通的有向图。满足点覆盖标准要求选取足够多的测试数据,使得程序执行路径至少经过流图的每个结点一次,由于流图的每个结点与一条或多条语句相
19、对应,显然,点覆盖标准和语句覆盖标准是相同的。847.边覆盖 图论中边覆盖的定义是:如果连通图G的子图G是连通的,而且包含G的所有边,则称G是G的边覆盖。为了满足边覆盖的测试标准,要求选取足够多测试数据,使得程序执行路径至少经过流图中每条边一次。通常边覆盖和判定覆盖是一致的。8.路径覆盖 路径覆盖的含义是,选取足够多测试数据,使程序的每条可能路径都至少执行一次(如果程序图中有环,则要求每个环至少经过一次)。857.6.2 控制结构测试 1.基本路径测试 2.条件测试 3.循环测试1.基本路径测试 方法概要“基本路径测试”是McCabe提出的基于“程序环形复杂度”来确定程序中路径进行测试的一种控
20、制结构测试方法,属于白盒测试技术。设计测试用例时,先计算程序的环形复杂度,以环形复杂度为指南,定义执行路径的基本集合,然后从该基本集合导出测试用例。覆盖能力 所设计出的测试用例可保证程序中的每一条语句至少执行一次(语句覆盖),且每个条件语句在执行时分别取真、假值至少一次(判定覆盖、或条件覆盖(如果拆成元条件)。87基本路径测试步骤1.根据过程设计结果转化成程序相应的流图按照教材6.4节中的方法。2.计算程序流图的环路复杂度由于程序流图的“环路复杂度”=程序“独立路径基本集”中的独立路径条数,这可确保程序中每个边至少经过一次测试所必需的测试用例数目的上界。3.确定线性独立路径的基本集合按照图论,
21、一条独立路径至少包含有一条在其他独立路径中从未有过的边。在程序流图中,一条独立路径至少包含有一条在其他独立路径中从未出现过的新语句或新条件。4.设计可强制执行基本基本集合中每条路径的测试用例根据判断结点给出的条件,选择适当的数据以保证每一条路径可以被测试到 用逻辑覆盖(语句覆盖、判定覆盖、条件覆盖、等)的方法。例:求平均值过程第一步:画流图 PROCEDURE average /*该过程计算不超过100个在规定值域内的有效数字的平均值;同时计算有效数字的总和和个数;*/INTERFACE RETURES average,total.input,total.valid;INTERFACE ACC
22、EPTS value,minimum,maximum;TYPE value1100 IS SCALAR ARRAY;TYPE average,total.input,total.valid;minimum,maximum,sum IS SCALAR;TYPE i IS INTERGE;1 i=1;total.input=total.valid=0;sum=0;2,3 DO WHILE valuei-999 AND total.inputminimum AND valuei011 THEN average=sum/total.valid;12 ELSE average=-999;13 ENDIF
23、 END average图7.6 求平均值过程的流图求平均值过程的PDL例:求平均值过程第二步:求环形复杂度环形复杂度=边数-节点数+2=17-13+2 =6例:求平均值过程第三步:求独立路径集由于环形复杂度为6,因此最多有6条独立路径:路径1:1-2-10-11-13路径2:1-2-10-12-13路径3:1-2-3-10-11-13路径4:1-2-3-4-5-8-9-2-路径5:1-2-3-4-5-6-8-9-2-路径6:1-2-3-4-5-6-7-8-9-2-注意:下一条路径应至少包含前面路径中没有出现的一条新边。例:求平均值过程第四步:设计测试用例路径1:1-2-10-11-13输入:
24、valuek=有效输入ki;valuei=-999,2=i=100。预期结果:k个有效输入的正确的平均值和总和。路径2:1-2-10-12-13输入:value1=-999预期结果:average=-999,其他保持初始值。即0个有效输入值。路径3:1-2-3-10-11-13输入:valuei=有效输入,1=i 100,即有效输入多于100个。预期结果:前100个有效输入的正确的平均值和总和。路径4:1-2-3-4-5-8-9-2-输入:valuei=有效输入,i100;valuekminimum,ki。即有值过小的无效输入。预期结果:滤除了过小值的正确的平均值和总和路径5:1-2-3-4-
25、5-6-8-9-2-输入:valuei=有效输入,imaximum,ki。即有值过大的无效输入。预期结果滤除了过大值的正确的平均值和总和。路径6:1-2-3-4-5-6-7-8-9-2-输入:valuei=有效输入,i100;预期结果:正确的平均值和总和。valuei-999AND total.input0valueiminimumAND valueimaximum2.条件测试 方法概述 条件测试是基于程序中的条件来设计测试用例的一种控制结构测试方法,是对基本路径测试技术的补充。该方法首先找出被测程序中的所有逻辑条件(分支语句、循环语句中的条件),在将复合条件分解成简单条件(布尔变量、关系表达
26、式),然后设计测试用例覆盖所有简单条件的取值及可能的构成复合条件的组合值。覆盖能力 条件测试的着重点是测试程序中的每个条件,测试用例应覆盖每个条件的各种取值和组成复合条件的简单条件的各种组合取值,可实现判定/条件覆盖、条件组合覆盖。条件表达式概念 条件表达式 条件表达式由布尔变量、关系表达式、布尔运算符、括号(改变计算优先序)组成,其计算结果的取值为“真”或“假”。又称为逻辑表达式。布尔表达式 由布尔变量和布尔运算符构成的表达式(不包含关系表达式),其计算结果的取值为“真”或“假”。布尔常量:“真”(T)、“假”(F);布尔变量:取值为“真”或“假”的变量。布尔运算符:OR(|)、AND(&)
27、、NOT()等。关系表达式 由算术量(常量、变量)、算术表达式、关系运算符构成的表达式,其计算结果的取值为“真”或“假”。关系表达式的一般形式为:E1 E2,其中E1、E2为算术表达式。关系运算符:。条件错误的类型 布尔算符错 布尔变量错 关系算符错 算术表达式错 括号错条件测试策略 分支测试 对于复合条件C,C的真分支、假分支、C中每个简单条件都至少执行一次。域测试 对于每个关系表达式(E1 E2),至少执行3个测试:E1比E2大、E1比E2小、E1与E2相同等 对于n个变量的布尔表达式,测试n个变量的各种取值的可能组合,共有2n种。(注意可行性,n太大将导致组合爆炸!)BRO测试(Bran
28、ch and relational operater)分支与关系运算符(BRO)测试对于条件C,分解出简单条件(假定为n个),确定C中对应各简单条件的输出约束(D1、D2、Dn),根据这些约束设计相应的测试用例。BRO测试策略 分支与关系运算符(BRO)测试:保证检测布尔 变量和关系运算符只出现一次而且没有公共变量 的条件中的分支和关系运算符错误。BRO策略利用条件C的条件约束。有n个简单条件 的条件C的条件约束定义为(D1,D2,Dn),其中Di刻画条件C中第I个简单条件的输出约束。如果C的执行过程中C的每个简单条件的输出都满 足D中对应的约束,则称条件C的条件约束D由C的 执行所覆盖。96
29、BRO测试举例 例1:C1:B1&B2 B1,B2为布尔变量。C1的条件约束形如(D1,D2),其中D1和D2的值是t或f。BRO测试策略要求约束集(t,t),(f,t),(t,f)由C1的执行所覆盖,如果C1由于布尔运算符错误而不正确,该约束集中至少有一个约束强制C1失败。例2:C2:B1&(E3=E4)B1为布尔变量,E3、E4为算术运算符。C2的条件约束为(D1,D2),其中D1约束是t或f,D2约束为关系运算符。因此约束集为(t,=),(f,=),(t,),此约束集的覆盖率将保证检测C2的布尔运算符和关系运算符错误。例3:C3:(E1E2)&(E3=E4)C3的条件约束为(D1,D2)
30、,约束集为(,=),(=,=),(,)。973.循环测试 方法概述 循环测试是专注于测试循环结构的有效性的一种白盒测试技术。测试的要点是发现循环次数控制中可能的错误。三种循环组合 简单循环:单个循环 嵌套循环:循环中有循环 串接循环:一个循环接着又一个循环98三种循环图7.7 3种循环简单循环测试方法 设计测试用例时考虑如下执行情况(假设n为循环容许的最多次数):通过循环0次(跳过循环)通过循环1次 通过循环2次 通过循环m次,1m100100 无效等价类无效等价类 成绩成绩00划分等价类的例(3)(3)如规定了输入数据的一组值,且程序对不同输入值如规定了输入数据的一组值,且程序对不同输入值做
31、不同处理,则每个允许的输入值是一个有效等价做不同处理,则每个允许的输入值是一个有效等价类,并有一个无效等价类类,并有一个无效等价类(所有不允许的输入值的集所有不允许的输入值的集合合)。例:输入条件说明学历可为例:输入条件说明学历可为:专科、本科、硕士、博士专科、本科、硕士、博士四种之一,则分别取这四个值作为四种之一,则分别取这四个值作为四个有效等价类四个有效等价类,另外把四种学历之外的任何学历作为无效等价类,另外把四种学历之外的任何学历作为无效等价类.划分等价类的例用等价类划分法设计测试用例步骤(1)构建等价类表 每一等价类(包括有效等价类和无效等价类)规定一个唯一的编号。(2)为有效等价类设
32、计测试方案(测试用例)设计一个新的测试用例,使其尽可能多地覆盖尚未覆盖的有效等价类,重复这一步骤,直到所有有效等价类均被测试用例所覆盖;(3)为无效等价类设计测试方案(测试用例)设计一个新的测试用例,使其只覆盖一个无效等价类,重复这一步骤直到所有无效等价类均被覆盖;113某报表处理系统要求用户某报表处理系统要求用户输入输入处理报表的处理报表的日期日期,日期限制在日期限制在20032003年年1 1月至月至20082008年年1212月月,即系统,即系统只能对该段期间内的报表进行处理,如日期不只能对该段期间内的报表进行处理,如日期不在此范围内,则显示输入错误信息。系统日期在此范围内,则显示输入错
33、误信息。系统日期规定由年、月的规定由年、月的6 6位数字字符组成,前四位代表位数字字符组成,前四位代表年,后两位代表月。年,后两位代表月。如何用等价类划分法设计测试用例如何用等价类划分法设计测试用例,来测试程来测试程序的日期检查功能?序的日期检查功能?例:“输入日期”的测试用例输入条件输入条件 有效等价类有效等价类 无效等价类无效等价类 报表日期的报表日期的类型及长度类型及长度6 6位数字字符位数字字符(1)(1)有非数字字符有非数字字符 (4)(4)少于少于6 6个数字字符个数字字符 (5)(5)多于多于6 6个数字字符个数字字符 (6)(6)年份范围年份范围在在20032003200820
34、08之间之间 (2)(2)小于小于2003 2003(7)(7)大于大于2008 2008(8)(8)月份范围月份范围在在1 11212之间之间(3)(3)“报表日期报表日期”输入条件的等价类表输入条件的等价类表小于小于1 1 (9)(9)大于大于12 12(10)(10)第一步:等价类划分 测试数据 期望结果 覆盖范围200306200306等价类等价类(1)(2)(3)(1)(2)(3)输入有效输入有效对表中编号为对表中编号为1,2,31,2,3的的3 3个有效等价类用一个测试用例覆盖个有效等价类用一个测试用例覆盖(1)(1)6 6位数字字符位数字字符(2)(2)年在年在200320032
35、0082008之间之间 (3)(3)月在月在1 11212之间之间第二步:为有效等价类设计测试用例 测试数据 期望结果 覆盖范围003003MAYMAY等价类等价类(4)(4)非数字非数字输入无效输入无效2003520035等价类等价类(5)(5)少于少于6 6位位输入无效输入无效20030052003005等价类等价类(6)(6)多于多于6 6位位输入无效输入无效200120010505等价类等价类(7)(7)小于小于20032003输入无效输入无效200920090505等价类等价类(8)(8)大于大于20032003输入无效输入无效200320030000等价类等价类(9)(9)小于小于
36、1 1输入无效输入无效200320031313等价类等价类(10)(10)大于大于1212输入无效输入无效不能出现相同不能出现相同的测试用例的测试用例本例的共有本例的共有1010个等价类个等价类至少需要至少需要8 8个测试用例个测试用例第三步:为每一个无效等价类至少 设计一个测试用例准考证号数据格式定义:共准考证号数据格式定义:共6 6为数字组成,其中第一位为专业代号:为数字组成,其中第一位为专业代号:1 1-行政专业行政专业,2 2-法律专业,法律专业,3 3-财经专业财经专业后后5 5位为考生顺序号,编码范围为:位为考生顺序号,编码范围为:行政专业准考证号码为行政专业准考证号码为:1 11
37、0001100011 11121511215 法律专业准考证号码为法律专业准考证号码为:2 210001100012 21200612006 财经专业准考证号码为财经专业准考证号码为:3 310001100013 31401514015 准考证号码的等价类划分准考证号码的等价类划分 有效等价类有效等价类:(1)110001(1)110001 111215111215 (2)210001 (2)210001 212006212006 (3)310001 (3)310001 314015314015 无效等价类无效等价类:(4)-(4)-110000110000 (5)111216 (5)1112
38、16 210000210000 (6)212007 (6)212007 3100031000 (7)314016 (7)314016 +例:考试系统“输入学生成绩”子模块设计测试录入准考证号的测试用例等价类划分等价类划分即把即把输入空间分解成一系列子域输入空间分解成一系列子域,软件在一,软件在一个子域内的行为应是等价的个子域内的行为应是等价的。软件错误分为两类:软件错误分为两类:计算错误和域错误计算错误和域错误u针对针对计算错误的测试方法计算错误的测试方法u针对针对域错误域错误的测试方法的测试方法:测试测试域边界域边界划定的正确性划定的正确性等价类划分2.边界值分析法边界值分析法与等价类划分法
39、区别 边界值分析不是从某等价类中随便挑一个作为代表,而是使这个等价类的每个边界都要作为测试条件。边界值分析不仅考虑输入条,还要考虑输出空间产生的测试情况被测试被测试子子 域域测试内点测试内点测试外点测试外点软件边界与悬崖很类似软件边界与悬崖很类似如果在悬崖峭壁边可以自信如果在悬崖峭壁边可以自信地安全行走,平地就不在话地安全行走,平地就不在话下。下。如果软件在能力达到极限时如果软件在能力达到极限时能够运行,那么在正常情况能够运行,那么在正常情况下就不会出什么问题下就不会出什么问题。边界值的选取 选取刚好等于、稍大于、稍小于等价类边界值的测试数据:测试临近边界的合法数据,以及刚超过边界的非法数据.
40、越界测试通常简单地加1或很小的数(对于最大值)和减1或很小的数(对于最小值).如果软件测试问题包含确定的边界,应考虑数据的类型及其特征:数据类型如:数值、字符、位置、数量、速度、地址、尺寸、等;数据类型的特征:第一个/最后一个、最小值/最大值、开始/完成、空/满、最慢/最快、相邻/最远、超过/在内、等。输入输入条件条件报表日报表日期的类期的类型及长型及长度度1 1个数字字符个数字字符5 5个数字字符个数字字符7 7个数字字符个数字字符有有1 1个非数字字符个非数字字符全部是非数字字符全部是非数字字符6 6个数字字符个数字字符显示出错显示出错显示出错显示出错显示出错显示出错显示出错显示出错显示出
41、错显示出错输入有效输入有效日期日期范围范围月份月份范围范围“报表日期(报表日期(6 6位数字字符)位数字字符)”边界值分析法测试用例边界值分析法测试用例测试用例说明测试用例说明测试数据测试数据期望结果期望结果选取理由选取理由5 52003520035200300520030052003.52003.5MAY-MAY-200305200305月份为月份为1 1月月月份为月份为1212月月月份月份11212200301200301200312200312200300200300200313200313200301200301200812200812200300200300200813200813输
42、入有效输入有效输入有效输入有效显示出错显示出错显示出错显示出错输入有效输入有效输入有效输入有效显示出错显示出错显示出错显示出错在有效范围在有效范围边界上选取边界上选取数据数据仅有仅有1 1个合法字符个合法字符比有效长度少比有效长度少1 1比有效长度多比有效长度多1 1只有只有1 1个非法字符个非法字符6 6个非法字符个非法字符类型及长度均有效类型及长度均有效最小日期最小日期最大日期最大日期刚好小于最小日期刚好小于最小日期刚好大于最大日期刚好大于最大日期最小月份最小月份最大月份最大月份刚好小于最小月份刚好小于最小月份刚好大于最大月份刚好大于最大月份有效等价类和用来测试有效等价类和用来测试getN
43、umDaysInMonthgetNumDaysInMonth()()方法方法所选的有效输入所选的有效输入 有效有效等价类一个月有一个月有3131天天,非闰年非闰年190119017(7(七月七月)一个月有一个月有3131天天,闰年闰年190419047(7(七月七月)一个月有一个月有3030天天,非闰年非闰年190119016(6(六月六月)一个月有一个月有3030天天,闰年闰年190419046(6(六月六月)一个月为一个月为2828或或2929天天,非闰年非闰年190119012(2(二月二月)月份输入值年份输入值一个月为一个月为2828或或2929天天,闰年闰年2(2(二月二月)1904
44、1904用来测试用来测试getNumDaysInMonthgetNumDaysInMonth()()方法的附加边界值方法的附加边界值 等价类可以被可以被400400整除的闰年整除的闰年200020002(2(二月二月)可以被可以被100100整除的非闰年整除的非闰年190019002(2(二月二月)非正数无效月份非正数无效月份129112910 0正数无效月份正数无效月份131513151313月份输入值年份输入值 3.错误推测法(error guessing)错误推测法根据经验、直觉和预感来进行测试。其基本思想是列举出程序中可能有的错误和容易发生错误的特殊情况,并根据他们设计测试用例。错误推
45、测用例选取在直觉认为容易出错的地方建立测试等价类:缺省值、空白、空值、零值、空表、只有一项的表、无输入条件等在已经找到软件缺陷的地方,根据其出错特点设计测试用例。4.因果图法 因果图适合于描述对于多种输入条件的组合,相应产生多个动作的形式来设计测试用例。因果图方法最终生成的是判定表。某电力公司有某电力公司有A A、B B、C C、D D四类收费标准四类收费标准,规定:规定:居民用电居民用电 100100度度/月月 按按A A类收费类收费 100100度度/月月 按按B B类收费类收费动力用电动力用电 1000010000度度/月月,非高峰非高峰,B,B类收费类收费 1000010000度度/月
46、月,非高峰非高峰,C,C类收费类收费 1000010000度度/月月,高峰高峰,C,C类收费类收费 1000010000度度/月月,高峰高峰,D,D类收费类收费因果图方法实例1 1I I1 12 2A AB BC C4 43 35 5D DI I4 4I I3 3I I2 2因因果果100100居民居民动力动力100000THEN Z=X ELSEZ=Y应变成 IF M*(X+Y)+T0THEN Z=X ELSE Z=Y习题7(续)正常运行时令M=1和T=0,测试期间令M=0,为测试THEN部分需令T=+1,测试ELSE部分则令T=-1。要求:(1)选取一个包含循环和IF语句的程序,用Laem
47、mel技术修改这个程序,上机实际测试这个程序并解释所得到的结果。(2)设计一个程序按照Laemmel技术自动修改待测试的程序。利用这个测试工具修改上一问中人工修改的程序,两次修改得到的结果一致吗?(3)怎样把Laemmel技术推广到包含WHILE DO 和REPEAT UNTIL语句的程序?(4)试分析Laemmel技术的优缺点并提出改进意见。习题7(续)8.对一个包含10000条机器指令的程序进行一个月集成测试后,总共改正了15个错误,此时MTTF=10h;经过两个月测试后,总共改正了25个错误(第二个月改正了10个错误),MTTF=15h。要求:(1)根据上述数据确定MTTF与测试时间之间
48、的函数关系,画出MTTF与测试时间的关系曲线。在画这条曲线时做了什么假设?(2)为做到MTTF=100h,必须进行多长时间的集成测试?当集成测试结束时总共改正了多少个错误,还有多少个错误潜伏在程序中?习题7(续)9.如对一个长度为100000条指令的程序进行集成测试期间记录下下面的数据:(a)7月1日:集成测试开始,没有发现错误。(b)8月2日:总共改正100个错误,此时MTTF=0.4h(c)9月1日:总共改正300个错误,此时,MTTF=2h据上列数据完成下列各题。(1)估计程序中的错误总数。(2)为使MTTF达到10h,必须测试和调试这个程序多长时间?(3)画出MTTF和测试时间之间的函数关系曲线。习题7(续)10.在测试一个长度为24000条指令的程序时,第一个月由甲、乙两名测试员各自独立测试这个程序。经一个月测试后,甲发现并改正20个错误,使MTTF达到10h。与此同时,乙发现24个错误,其中6个甲也发现了。以后由甲一个人继续测试这个程序。问:(1)刚开始测试时程序中总共有多少个潜藏的错误?(2)为使MTTF达到60h,必须再改正多少个错误?还需用多长测试时间?(3)画出MTTF与集成测试时间之间的函数关系曲线。本章完