第 六 章
6.1软件测试的基本概念一、软件测试的目的和重要性因为开发工作的前期不可避免地会引入错误,测试的 目的是为了发现和改正错误,这对于某些涉及人的生命安全或重要的军事、经济目标的项目显得尤其重要。
1963年美国飞往火星的火箭爆炸,原因是
FORTRAN程序,DO 5 I=1,3
误写为,DO 5 I=1,3 损失 1000万美元。
1967年苏联“联盟一号”宇宙飞船返回时因忽略一个小数点,在进入大气层时打不开降落伞而烧毁。
退出上页首页 下页 末页二、软件测试的 特点
1、软件测试的开销大按照 Boehm的统计,软件测试的开销大约占总成本的 30%-50%。例如,APPOLLO登月计划,
80%的经费用于软件测试。
2、不能进行“穷举”测试只有将所有可能的情况都测试到,才有可能检查出所有的错误。但这是不可能的:
例:程序 P有两个整型输入量 X,Y,输出量为 Z,
在 32位机上运行。所有的测试数据组( Xi,Yi) 的数目为,2 2 = 2 1毫秒执行 1次,共需 5
亿年。
32 32 64
P
X
Y Z
退出上页首页 下页 末页二、软件测试的 特点 —结论
3、软件测试难度大根据上述分析,既然不能进行,穷举”测试,
又要查出尽可能多的错误,软件测试工作的难度大。只有选择 —
“高效的测试用例”
什么是,高效的测试用例”?
如何选择,高效的测试用例”?
这就是本章讨论的主要问题!!!
退出上页首页 下页 末页三、软件测试的基本原则
3、充分注意测试中的群集现象。
1、尽量不由程序设计者进行测试。
2、关键是注重测试用例的选择。
输入数据的组成(输入数据、预期的输出结果)
既有合理输入数据,也有不合理的输入数据。
用例既能检查应完成的任务,也能够检查不应该完成的任务。
长期保存测试用例。
退出上页首页 下页 末页四、测试的基本步骤模块测试整体测试功能测试预测试系统测试验收测试安装测试概要设计审查详细设计审查代码审查测试
(单元测试)
(组装测试)
(有效性测试)
(确认测试){
{
退出上页首页 下页 末页
6.2 软件测试方法软件测试方法分为两类:静态分析、动态测试一、静态分析方法指以人工的,非形式化的方法对程序进行分析和测试 。
桌前检查 代码会审 步行检查步行检查时,还常使用以下分析方法:
① 调用图从语义的角度考察程序的控制路线。
② 数据流分析图检查分析变量的定义和引用情况。
退出上页首页 下页 末页
① 调用图无论 Y 为何值,都不能够调用子程序 。
READY
Y>0 N
X:=Y
X<0
Y
N
Y
调用子程序
A
B
C
D
E
退出上页首页 下页 末页即执行 ABC后,是不可能执行路径
CDE的。
② 数据流分析图节点 —表示单个语句。
有向边 —表示控制结构。
d — 定义
r — 引用
u — 未引用
R,duuuuu
S,uruuur
Y,uuddru
R=0.5
W=1/S
Y=A**W
Y=E*W
Z=X+Y
C=Z*S
1
2
3
4
5
6
只定义不用未定义引用连续定义退出上页首页 下页 末页二、动态测试方法 ( 1)
通过选择适当的测试用例,执行程序。
常用的方法:
1、白盒法分析程序的内部逻辑结构,注意选择适当的覆盖标准,设计测试用例,对主要路径进行尽可能多的测试。
2、黑盒法不考虑程序的内部结构与特性,只根据程序功能或程序的外部特性设计测试用例。
退出上页首页 下页 末页白盒法白盒法又称为逻辑覆盖法,其测试用例选择,
是按照不同覆盖标准确定的。
语句覆盖判定覆盖条件覆盖判定条件覆盖条件组合覆盖弱 强退出上页首页 下页 末页
① 语句覆盖,选择足够的测试用例,使得程序中每个语句至少都能被执行一次 。
② 判定覆盖,执行足够的测试用例,使得程序中每个判定至少都获得一次,真,值和,假,值。
③ 条件覆盖,执行足够的测试用例,使得判定中的每个条件获得各种可能的结果 。
④ 判定 /条件覆盖,执行足够的测试用例,使得判定中每个条件取到各种可能的值,并使每个判定取到各种可能的结果 。
⑤ 条件组合覆盖,执行足够的例子,使得每个判定中条件的各种可能组合都至少出现一次 。
白盒法 常用的覆盖标准退出上页首页 下页 末页白盒法步骤:
例:用 白盒法测试以下程序段:
Procedure( VAR A,B,X,REAL);
BEGIN
IF ( A>1) AND (B=0)
THEN X:=X/A ;
IF (A=2) OR (X>1)
THEN X:=X+1
END;
1)选择逻辑覆盖标准。
2)按照覆盖标准列出所有情况。
3)选择确定测试用例。
4)验证分析运行结果与预期结果。
退出上页首页 下页 末页逻辑结构白盒法举例
Procedure ( VAR A,B,X:REAL);
BEGIN
IF( A>1) AND (B=0)
THEN X:=X/A ;
IF (A=2) OR (X>1)
THEN X:=X+1
END;
A>1
AND
B=0
X:=X/A
退出上页首页 下页 末页
A=2
OR
X>1
X:=X+1
Y
N
Y
N
逻辑结构
1、语句覆盖 使得程序中每个语句至少都能被执行一次。
退出上页首页 下页 末页
A>1
AND
B=0
X:=X/A
A=2
OR
X>1
X:=X+1
a
b
c
d
e
满足语句覆盖的情况:
执行路径,ace
选择用例:
[(2,0,4),(2,0,3)]
用例格式:
[输入 (A,B,X),输出 (A,B,X)]
Y
N
Y
N
2、判定覆盖使得程序中每个判定至少为 TRUE 或 FALSE各一次。
退出上页首页 下页 末页
A>1
AND
B=0
X:=X/A
A=2
OR
X>1
X:=X+1
a
b
c
d
e
覆盖情况,应执行路径
ace ∧ abd 或,acd ∧ abe
选择用例 (其一):
⑴ [(2,0,4),(2,0,3)] ace
[(1,1,1),(1,1,1)] abd
⑵ [(2,1,1),(2,1,2)] abe
[(3,0,3),(3,1,1)] acd
Y
Y
N
N
3、条件覆盖退出上页首页 下页 末页
A>1
AND
B=0
X:=X/A
A=2
OR
X>1
X:=X+1
a
b
c
d
e
使得判定中的每个条件获得各种可能的结果。
应满足以下覆盖情况:
判定一,A>1,A≤1,B=0,B≠0
判定二,A=2,A≠2,X>1,X≤1
选择用例:
[(2,0,4),(2,0,3)]
[(1,1,1),(1,1,1)]
N
N
Y
Y
A≤1
A≠2
B=0
X>1
B≠0
X≤1
注意,[(1,0,3),(1,0,4)]
[(2,1,1),(2,1,2)]
满足条件覆盖,但不满足判断覆盖。
4、判定 /条件覆盖 同时满足判断覆盖和条件覆盖。
退出上页首页 下页 末页
A>1
AND
B=0
X:=X/A
A=2
OR
X>1
X:=X+1
a
b
c
d
e
应满足以下覆盖情况:
条件,A>1,A≤1,B=0,B≠0
A=2,A≠2,X>1,X≤1
应执行路径
ace ∧ abd 或,acd ∧ abe
选择用例:
[(2,0,4),(2,0,3)]( ace)
[(1,1,1),(1,1,1)] (abd)
Y
Y
N
N
5、条件组合覆盖 使得每个判定中条件的各种可能组合都至少出现一次。
退出上页首页 下页 末页
A>1
X:=X/A
A=2
X:=X+1
a
b
c
d
e
B=0
X>1
Y
N
Y
N
Y
N
Y
N
编译系统下的执行情况:
部分路径未被执行。
满足以下覆盖情况:
① A>1,B =0 ② A>1,B≠0
③ A≤1,B =0 ④ A≤1,B≠0
⑤ A=2,X>1 ⑥ A=2,X≤1
⑦ A≠2,X>1 ⑧ A≠2,X≤1
选择用例:
[(2,0,4),(2,0,3)] ① ⑤
[(2,1,1),(2,1,2)] ② ⑥
[(1,0,3),(1,0,4)] ③ ⑦
[(1,1,1),(1,1,1)] ④ ⑧
作业:
退出上页首页 下页 末页
PROGRAM bubble(input,output);
CONST n=100;
TYPE colarr=ARRAY[1..n] OF INTEGER;
VAR a,colarr; t,i,j,INTEGER;
BEGIN
FOR i:=1 TO n DO READ(a[i]); READLN;
FOR j:=1 TO n-1 DO
FOR i:=1 TO n-j DO
IF a[i]>a[i+1] THEN
BEGIN
t:=a[i]; a:=a[i+1]; a[I+1]:=t
END;
FOR i:=1 TO n DO
BEGIN WRITE(a[i]:4);
IF I MOD 5=0 THEN WRITELN
END; WRITELN
END.
用白盒法测试以下程序段,要求写出覆盖标准,列出所有判定情况,选择测试用例。
二、动态测试方法 ( 2)
退出上页首页 下页 末页等价分类法边值分析法错误推测法因果图法
(2)黑盒法不考虑程序的内部结构与特性,
只根据程序功能或程序的外部特性设计测试用例。
1、等价分类法基本思想,根据程序的 I/O特性,将程序的定义域划分为有限个等价区段 —,等价类,,
从等价类中选择出的用例,具有,代表性,。
退出上页首页 下页 末页等价类分为:
有效等价类 —对于程序的规格说明,是合理的、有意义的输入数据构成的集合。
无效等价类 —对于程序的规格说明,是不合理的、没有意义的输入数据构成的集合。
等价分类法步骤应按照输入条件 ( 如输入值的范围,值的个数,值的集合,输入条件必须如何 ) 划分为有效等价类和无效等价类 。
例如:每个学生可选修 1-3门课程可以划分一个有效等价类:选修 1-3门课程 。
可以划分两个无效等价类:未选修课,选修课超过 3门 。
又如:标识符的第一个字符必须是字母 。
可以划分为一个有效等价类:第一个字符是字母 。
可以划分一个无效等价类:第一个字符不是字母 。
① 划分,等价类,
显然,关键是如何划分等价类
A,为每个等价类编号;
B,使一个测试用例尽可能覆盖多个有效等价类
C,特别要注意的是:一个测试用例只能覆盖一个无效等价类 。
② 选择测试用例等价分类法步骤
2、边值分析法基本思想,选择等价类的边缘值作为测试用例,
让每个等价类的边界都得到测试,选择测试用例既考虑 输入 亦考虑 输出 。
退出上页首页 下页 末页分析步骤:
A,先划分等价类。
B,选择测试用例,测试等价类边界。
边界 选择原则:
A,按照输入值范围的边界。
B,按照输入 /输出值个数的边界。
C,输出值域的边界。
D,输入 /输出有序集的边界。
A,按照输入值范围的边界 。
例如:输入值的范围是 -1.0至 1.0,则可选择用例 –1.0、
1.0,-1.001,1.001。
B,按照输入 /输出值个数的边界 。
例如:输入文件可有 1-255个记录,则 设计用例:文件的记录数为 0个,1个,255个,256个 。
C,输出值域的边界 。
例如:检索文献摘要,最多 4篇 。 设计用例:可检索 0篇,
1篇,4篇,和 5篇 ( 错误 ) 。
D,输入 /输出有序集 ( 如顺序文件,线性表 ) 的边界 。
应选择第一个元素和最后一个元素 。
边值分析法举例黑盒法应用实例退出上页首页 下页 末页对 FORTRAN编译系统中的 DIMENSION语句进行测试。
语句格式为,DIMENSION ad[,ad] … ad为数组描述符,
形式为 n( d[,] … 其中,n- 数组名,字母打头的字母数字串,长 6。
D为界偶 ( 1-7个 ),[ld:]nd ld 和 nd 的值为 1-65535,ld缺省为 1。
输入条件 合理的等价类 不合理的等价类数组描述的个数 1个( 1)、多于 1个( 2) 没有数组描述( 3)
数组名的字符数 1— 6个( 4) 0( 5),>6( 6)
数组名 有字母( 7)有数字( 8) 有其他字符( 9)
数组名的第 1个字符为字母 是( 10) 不是( 11)
维数 1— 7( 12) 0( 13),>7( 14)
上界 常数( 15) 数组元素名( 16
40 个等价类
3、错误推测法凭经验或直觉推测可能的错误,列出程序中可能有的错误和容易发生错误的特殊情况,选择测试用例。
退出上页首页 下页 末页把输入条件视为,因,,把输出条件视为
,果,,将黑盒看成是从因到果的网络图,采用逻辑图的形式来表达功能说明书中输入条件的各种组合与输出的关系。根据这种关系可选择高效的测试用例。
因果图是一种形式化语言,是一种组合逻辑网络图。
4、因果图法
4、因果图法( cause effcet graphicei)
⑴ 因果图的基本符号
0 - 表示“不出现” 1 - 表示“出现”
退出上页首页 下页 末页恒等若 a为 1,则 b为 1,否则 b为 0。
,非,函数若 a为 1,则 b为 0,否则 b为 1。
,或,函数若 a或 b为 1,则 d为 1,否则 d为 0。
,与,函数若 a与 b同为 1,则 d为 1,否则 d为 0。
a b
a b
a
b
d∨
a
b
d∧
4、因果图法 ( cause effcet graphicei)
对,与,,,或,函数的限制符号退出上页首页 下页 末页
E约束(异) — 排斥即 a,b不能同时为 1。
I约束(或) — 包容
a,b,c不能同时为 0。
O约束(唯一 ) — 选一
a,b中仅有一个为 1。
R约束(要求 ) — 需要
a为 1时,b必须为 1
M约束(强制 ) — 屏蔽若 a为 1时,则 b强制为 1。
a
b
E
a
b
c
I
a
bR
a
bO
a
b
M
⑵ 因果图法的步骤分析规范,即将问题分为若干可工作的步骤。
标识出规范中的原因与结果。
原因 —输入条件结果 —输出或系统变换退出上页首页 下页 末页将因果图转换为有限项判断表。
将判断表的每一列,转换为一个测试用例。
分析规范语义、内容,转换为因果图。
⑶ 因果图法应用举例规范:文件名第一列字符必须为 A或 B,第二列字符必须为数字。满足则修改文件。第一字符不正确发出信息 X12,第二个字符不正确发出信息 X13。
退出上页首页 下页 末页
1、分析规范原 因 结 果
1 — 第一列字符为 A 50—修改文件
2 — 第一列字符为 B 51—发信息 X12
3 — 第二列字符为数字 52—发信息 X13
2、画出因果图中间结点 是导出结果的进一步原因 。
退出上页首页 下页 末页考虑到原因 1,2不可能同时为 1,加上 E约束。
11
11∨
51
50
3 52

1
2
E
发 X 12
发 X 13
修改文件
3、将因果图转换为判断表退出上页首页 下页 末页
1 2 3 4 5 6 7 8
条件原因
① 1 1 1 1 0 0 0 0
② 1 1 0 0 1 1 0 0
③ 1 0 1 0 1 0 1 0
1 1 1 1 0 0
动作结果
0 0 0 0 1 1
1 0 1 0 0 0
0 1 0 1 0 1
测试用例 A3
A8
AM
A?
B5
B4
BN
B!
C2
X6
DY
PI
11
51
50
52
6.3 软件测试的步骤测试步骤及策略所有测试过程都应采用综合测试策略;即先作静态分析,再作动态测试。并事先制订测试计划。测试过程通常可分 4步进行:
退出上页首页 下页 末页单元测试单元测试单元测试被测模块被测模块集成测试设计信息已测试的模块确认测试已集成的模块软件需求系统测试已确认的软件可交付的软件系统其他元素一、模块测试 ( Module Testing)
1、测试内容退出上页首页 下页 末页模块模块接口测试局部数据结构测试重要路径测试错误处理测试边界条件测试
I/O 参数值的个数、
类型、次序、格式是否正确,I/O文件属性、
操作是否正确等。
数据说明是否正确、
一致,变量及其初值定义是否正确等。
检查“错误处理程序”本身的错误。
边界条件常包括循环边界,最大最小值、控制流中等于、
大于、小于的比较值等。
重要 路径通常是指完成模块功能的主要路径,一般是控制结构。
也称单元测试( unit testing )
2、模块测试步骤考虑到被测模块与其它模块的联系,因此测试时需要使用两类 辅助模块 来模拟其他模块。
退出上页首页 下页 末页驱动模块 ( driver) — 模拟主程序功能,用于向被测模块传递数据,
接收、打印从被测模块返回的数据。
桩模块 ( stub) — 又称为假模块,
用于模拟那些由被测模块所调用的下属模块功能。
一般,驱动模块比桩模块容易设计。但都是额外开销。测试方法以白盒法为主。
被测模块驱动模块桩模块桩模块 桩模块二、组装测试 ( Integration Testing)
1、组装测试的任务
①确定模块组装方案,将经过测试的模块组装为一个完整的系统。组装方案分为 渐增式 及 非渐增式。
②测试方法以黑盒法为主,按照组装方案进行测试。
退出上页首页 下页 末页也称为 联合测试 或 集成测试,重点测试模块的接口部分,需设计测试过程使用的驱动模块或桩模块。
问题,渐增式与非渐增式各有何优、缺点?为什么通常采用渐增式?
2、渐增式组装测试渐增式是先进行模块测试,然后将这些模块逐步组装成较大的系统,每连接一个模块进行一次测试 。 两种方案:
退出上页首页 下页 末页设计驱动模块或桩模块,对每一个新组装的子系统进行测试,对发现问题较多的子系统或模块应该用白盒法作回归测试。
自顶而下增值自底而上 增值自顶而下增值退出上页首页 下页 末页
M1
M4M3M2
M6M5
程序模块示意图S5
M1
S1 S2 S3
第一步,测试主控模块 M1设计桩模块 S1,S2,S3,模拟被 M1调用的 M2,M3,M4。
M2 M3 M4
第二步,依次用 M2,M3、
M4替代桩模块 S1,S2,S3,
每替代一次进行一次测试。
S4
第三步,对由主控模块 M1和模块 M2,M3,M4构成的子系统进行测试,设计桩模块
S4,S5。
M5 M6
第四步,依次用模块 M5和
M6替代桩模块 S4,S5,并同时进行新的测试。组装测试完毕。
自底而上 增值退出上页首页 下页 末页
M3
M6M5
D1
D2
D3M2 M4
M1
第四步,把已测试的子系统按程序结构连接起来完成程序整体的组装测试。
D4 D5 M1
M4M3M2
M6M5
程序模块示意图第一步,对最底层的模块 M3、
M5,M6进行测试,设计驱动模块 D1,D2,D3来模拟调用。
第三步,设计驱动模块 D4、
D5 和 D6模拟调用,分别对新子系统进行测试。
第二步,用实际模块 M2、
M1和 M4替换驱动模块 D1、
D2,D3。
D6
深度优先与宽度优先无论是 自顶而下增值还是自底而上增值,还可选择深度优先 或者 宽度优先 增值。
退出上页首页 下页 末页举例:按自顶而下增值法,写出下图中分别按照 深度优先 或者 宽度优先 增值的模块组装次序。
A
B C D
HG
J
E F I
K L M N
问 题
( 1)自顶而下增值与 自底而上 增值各有何优、
缺点?
( 2)为什么在实际的组装测试中,都应该采用混合增值的方法?
( 3)请自己设计 2-3个混合增值的测试方法。
退出上页首页 下页 末页
mathbase@uestc.edu.cn
确定集成过程的原则自顶而下增值优点:能够尽早发现系统主控方面的问题。
缺点:无法验证桩模块是否完全模拟了下属模块的功能。
自底而上 增值优点:驱动模块较容易编写桩模块,能够尽早查出底层涉及较复杂的算法和实际的 I/O模块中的错误。
缺点:最后才能发现系统主控方面的问题。
退出上页首页 下页 末页集成过程的原则
① 尽早测试关键模块。
② 尽早测试包含 I/O的模块。
3、混合增值常见的 混合增值方案:
衍变的自顶而下先自底而上集成子系统,再自顶而下集成总系统。
退出上页首页 下页 末页自底而上 —自顶而下增值对含有读操作的子系统采用自底而上。
对含有写操作的子系统采用自顶而下。
回归测试在回归测试中自底而上,对其余部分(尤其是对修改过的子系统)采用自顶而下。
三、确认测试 (validation testing)
1、任务又称为有效性测试或功能测试。其任务是验证系统的功能、性能等特性是否符合需求规格说明。
退出上页首页 下页 末页选择测试人员选择测试用例实际运行测试软件计划用户文档开发文档源程序文本支持环境有效性测试软件配置审查管理机构裁决专家鉴定会交用户运行维护测试报告软件配置
2、确认测试步骤
( 1)有效性测试制定测试计划,运用黑盒法,验证软件特性是否与需求符合。
退出上页首页 下页 末页
( 2)软件配臵复查软件配臵 —指软件工程过程中所产生的所有信息项:文档、报告、程序、表格、数据。随着软件工程过程的进展软件配臵项( SCI software
Configuration Item) 快速增加和变化。应复查
SCI是否齐全。
( 3)?测试和?测试退出上页首页 下页 末页
测试 是在开发机构的监督下,由个别用户在确认测试阶段后期对软件进行测试,目的是评价软件的 FLURPS( 功能、局域化、可使用性、可靠性、性能和支持),注重界面和特色。
测试 由 支持软件预发行 的客户对 FLURPS进行测试,主要目的是测试系统的可支持性。
Function Testing 功能测试
Local Area Testing 局域化测试
Usability Testing 可使用性测试
Regression Testing 回归测试
Performance Testing 性能测试
Supportability Testing 可支持 性测试四、系统测试 ( system testing )
将经过确认测试的软件,与计算机硬件、外设、
支持软件等一起,在实际运行环境下测试。
退出上页首页 下页 末页五、验收测试( acceptance testing)
验收测试是以用户为主的测试。软件工程课程设计的验收测试,19周进行。
1、步骤为:
( 1)由课题组根据测试用例,自己演示系统所有功能。
( 2)由教师进行测试。
2、软件工程课程设计验收表退出上页首页 下页 末页文档文档数量 文档质量 文档与系统一致性 创新性 总体
( 12分) ( 15分) ( 5分) ( 3分) ( 35分)
系统运行系统运行功能、性能系统结构总体设计合理性用户界面操作简便、
帮助信息有无创新系统特色总体
( 25分) ( 10分) ( 10分) ( 5分) ( 50分 )
其它个人工作量验收操作独立分析解决问题能力团结协作精 神爱护公物遵守纪律 总体
( 9分) ( 4分) ( 1分) ( 1分) ( 15分)
3、软件测试文档模块测试报告至少选择一个典型模块进行测试。
A,综合测试策略(静态分析、白盒法为主,辅以黑盒法)
B,测试情况(根据覆盖标准列出)
C,测试用例(保留)
D,查错记录(数量、位臵)、分析结果。
组装测试报告
A,组装次序、测试方法(以黑盒法为主)
B,测试情况
C,测试用例(保留)
D,查错记录(数量、位臵)、分析结果。
功能测试与系统测试 与上类似。
退出上页首页 下页 末页
6.4 软件纠错技术软件测试的目的是发现错误,在发现错误后,
则应按照一定的技术去纠正它。纠错的关键是
“错误定位”。
退出上页首页 下页 末页一、纠错的原则
1、注意错误的“群集现象”。
2、不能只修改错误的征兆、表现。还应该修改错误的本质。
3、注意在修改一个错误的同时,又引入新的错误。
二、纠错的技术
1、硬性纠错又称为蛮干法,是使用较多,效率较低的方法。
退出上页首页 下页 末页主存信息转储法关键部分设臵打印语句使用自动纠错工具
2、回 溯法排错适用于小程序。发现错误时,人工沿控制流追踪源代码程序。
3、归纳法从测试结果发现的错误入手,分析它们之间的联系查找错误。是一种从特殊推断一般的系统化思考方法。
退出上页首页 下页 末页收集有关数据 组织数据研究数据间的关系 提出假设证明假设纠正错误能能不能不能列出所有已知的测试用例和程序执行结果常用的构造线索的技术是“分类法”
分析线索之间的关系,找出矛盾,设计出错原因的假设归纳排错法步骤将假设与原始线索或数据进行比较,
能否解释现象,证明假设。
yes no
What
When
where
How
4、演绎法排错演绎法是一种从一般原理出发,经过排除和精化的过程,推导出结论的方法。
退出上页首页 下页 末页列举可能的原因排除不适当的原因对保留的假设继续推断证明假设纠正错误收集更多的数据没有剩余 不能能有剩余演绎法排错的步骤