第六章 软件测试
§ 6.1 基本概念软件开发过程必须伴有质量保证活动。
软件测试是软件质量保证的关键元素,代表了规约、设计和编码的最终检查。
有关测试的思考题
软件测试是一门非常重要的学科,主要研究内容是什么?
软件测试需要什么样的专业基础
软件质量到底是什么?
测试的目标是什么?
开发一个测试系统之前你是否明白,
可以 测试什么?
应该 测试什么?
最终 能够 测试什么?
软件产品最大的成本是检测软件错误、修正软件错误的成本。
在整个软件开发中,测试工作量一般占 30%~ 40%,甚至 ≥ 50%。
在人命关天的软件 (如飞机控制、
核反应堆等)测试所花费的时间往往是其它软件工程活动时间之和的三到五倍软件测试背景软件是人编的 — 所以不完美实例,
1994-1995,迪斯尼的狮子王系统不支持问题
Intel的 pentium处理器
1994年浮点除法缺陷
200年 8月 28日,1.13MHZ处理器一个可能导致运行程序被挂起的执行指令问题
1999年 12月 3日,美国航天局火星极地登陆飞船失踪
1991年爱国者导弹防御系统系统时钟错误积累造成跟踪系统失去精确度
千年虫,世界各地解决 2000年错误超过数亿美元软件测试的认识的发展人们对软件测试认识的五个阶段:
阶段 1 — 测试 =调试阶段 2 — 测试是证明软件正确阶段 3 — 测试是发现软件中错误阶段 4 — 测试是减小软件不工作的风险
(是度量软件质量要素的过程

阶段 5 —测试可产生低风险的软件的一种认识上的训练三个盲人和一头大象:你能够为质量下定义吗?
质量管理领域权威人物 J.M.Juran将质量定义为,决定产品性能和 ‘ 满意程度 ’ 的特征”,测试注重于产品的满意度。
测试应针对这样一种情况:
软件产品在一些特定的范围内不能满足客户的合理要求。
通过测试过程可以评定 质量风险(可能的错误),了解被测试系统中存在的 错误模式(观察到的错误症状) 。
质量控制技术质量控制活动分类开发方法学配置管理验证技术评 审正确性验证性能调试组件测试集成测试系统测试原子事务模块冗余性检 错质量控制避免错误容 错调 试测 试软件质量问题以软件测试为中心的软件质量保障技术软件 静态测试技术质量 软件度量技术控制 动态测试技术技术 配置管理技术修改控制与管理技术软件测试是保证软件质量,提高软件可靠性的关键软件测试的目标
(1)预防错误,几乎不可实现
(2)发现错误
6.1.1 测试的目的与地位
G.J.Myers在 <软件测试技巧 >中认为,
1.测试是为了寻找错误而运行程序的过程。
2.一个好的测试用例是指很可能找到迄今为止尚未发现的错误的测试。
3.一个成功的测试是揭示了迄今为止尚未发现的错误的测试。
E.W.Dijkstra 指出,
“程序测试能证明错误的存在,但不能证明错误不存在,”
测试的目的是发现程序中的错误,是为了 证明程序有错,
而不是证明程序无错,
把证明程序无错当作测试目的不仅是不正确的,完全做不到的,而且对做好测试没有任何益处,甚至是 十分有害的,
软件测试要设法使软件发生故障,
暴露软件错误测试的,成功,与,失败,
能够发现错误的测试是成功的测试,否则是失败的测试 。
,测试的目的是说明程序正确地执行它应有的功能,这种说法正确吗?
例:程序 Triangle,输入三个整数,表示一个三角形的三个边长,该程序产生一个结果
,指出该三角形是等边三角形,等腰三角形还是不等边三角形 。
为说明其能正确执行它的功能,可使用
,测试用例,(3,4,5),(5,5,6),(6,6,6),
程序都能给出正确结果,是否就可认为程序是正确的?
难以说清的软件缺陷古谚:,一片树叶飘落在森林中没有人听见

谁能说它发出了声音?”
由于不能报告没有看见的问题,因此

没有看见就不能说存在软件缺陷如果软件中的问题没有人发现,那么它算不算软件缺陷?”
只有看到了,才能断言软件缺陷,尚未发现的软件缺陷只能说是未知软件缺陷。
眼见为实
6.1.2 测试原则
(1)所有的测试都应追溯到用户需求最严重的错误 (从用户角度 )是那些导致软件无法满足需求的错误。
程序中的问题根源 可能在开发前期的各阶段解决、纠正错误也必须追溯到前期工作。
测试与开发前期工作的关系决定软件与系统的配合关系需求分析概要设计详细设计编 码单元测试集成测试确认测试系统测试开发前期出现错误的扩展计划需求分析设计编码测试
A B
软件生存期各阶段间需保持的正确性用户要求用户,
我要什么?
运行结果计算机,
程序运行得到的结果源程序程序员,
我要让计算机什么做?
设计说明书设计员,
我要让软件做什么?
需求说明书分析员,
我可以提供什么?
1
2 3
4
5理解正确性表达正确性理解正确性设计正确性表达正确性理解正确性编码正确性运行正确性输入正确性相符吗?
测试原则
(2)概要设计时应完成测试计划,
详细的测试用例定义可在设计模型确定后开始,所有测试可在任何代码被产生之前进行计划和设计。
软件测试不等于程序测试软件测试应贯穿于软件定义与开发的整个期间;
据美国一家公司统计,查出的软件错误中,属于 需求分析和软件设计的错误 约占 64%,属于程序编写的错误仅占 36%。程序编写的许多错误是,先天的,。
测试阶段工作步骤?
单元测试,检验每个模块能否单独工作,?
集成测试,检验概要设计中模块接口设计问题?
确认测试,以需求规格说明书为检验尺度?
系统测试,综合检验测试可视为分析,设计,编码三个阶段的最终复审,以保证软件质量,
测试原则
(3)pareto原则:测试发现的错误中 80%
很可能起源于 20%的模块中。应孤立这些疑点模块重点测试。
(4)穷举测试是不可能的。
(5)应由独立的底三方来构造测试。
(开发和测试队伍分别建立)
测试原则例,测试计算器程序
加法测试
1+0=
……
1+99999999999999999999999999999999=
2+0=
……
2+99999999999999999999999999999999=
……
99999999999999999999999999999999+99999999999999999999999999999999=
1.0+0.1=
1.0+0.2=
……
减法测试
乘法测试
除法测试
求平方根
百分数
倒数测试原则
(6)测试用例应由输入数据和预期的输出结果两部分组成,
(7)兼顾合理的输入和不合理的输入数据
(8)程序修改后要回归测试
(9)应长期保留测试用例,直至系统废弃。
测试原则,软件测试是有风险的行为数量遗漏软件缺陷数目 测试费用测试中 测试后软件测试工作量每一个软件项目都有一个最优的测量量最优测量量
6.1.3 可 测试性可测试软件的特征:
可操作性
可观察性
可控制性
可分解性
简单性
稳定性
易理解性
“好,测试的属性:
发现错误的可能性高
不冗余
在目的相似的测试中,应使用最可能找到错误的测试
每一个测试应独立执行软件测试有关概念测试中用到的模型元素( UML类图)
测试组测试用例故 障组 件测试存根测试驱动程序误 差 错 误改 正由 …… 修改由 …… 引起由 …… 引起找出使用修改
1… n*
*
* * *
*
*
* * *
*
组件 是系统中可以孤立进行测试的部分,一个组件可以是对象,一组对象,一个或多个子系统。
错误,也称缺陷或不足,是可能引起组件不正常行为的设计或编码错误。
误差 是系统执行过程中错误的表现。
故障 是组件的规格说明与其行为之间的偏差,故障是由一个或多个误差引起的。
测试用例 是一组输入和期待的结果,它根据引起故障和检查的目的来使用组件。
测试存根 是被测试的组件所依赖的其它一些组件的实现部分。 测试驱动程序 是依赖被测试组件的那个组件的实现部分。
改正 是对组件的变化。改正的目的在于修正错误。改正可能会产生新的错误。
错误 (fault),误差 (error)和 故障 (failure)
出轨 (出故障 )?
图中不表示故障,因为既没有指定期望行为也没有任何观察的行为,
它也不表示误差,因为这不意味着系统正处在进一步处理将导致故障的状态,
错误 (fault),误差 (error)和 故障 (failure)
用例名称 DriveTrain
参与执行者 火车司机入口条件 司机按下控制面板上的 StrartTrain
事件流 1.列车开始在轨道 1上运行
2.列车平移到轨道 2
退出条件 列车运行在轨道 2上特殊条件 没有用例 DriveTrain指定了列车的期望行为,
错误 (fault),误差 (error)和 故障 (failure)
测试用例标识符 DriveTrain
测试位置 http://www12.in.tum.de/……
要测试的特征 引擎连续运行 5s
特征合格 /不合格标准 如果列车连续前进 5s,并且至少通过两个轨道的长度,则测试通过控制方法 驱动程序 StrartTrain调用 StrartTrain()
方法数据 从输入文件 http://www12.in.tum.de/… 中得到运行方向和持续时间
…… ……
用例 DriveTrain的测试用例 DriveTrain,
执行这个测试用例时,可以证明系统是包含有错误的软件测试有关概念 —术语和定义软件测试要精度还是准确度很大程度上取决于产品是什么,最终取决于开发小组的目标。
既不准确又不精确 精确但不准确 准确但不精确 既准确又精确精确和准确软件测试有关概念 —术语和定义
验证和合法性检查
验证是检查软件符合产品说明书的过程
合法性检查是保证软件满足用户要求的过程
质量和可靠性可靠性只是质量的一个方面
测试和质量评判( QA)
软件测试员的目标是找出软件缺陷
软件质量评判人员的主要职责是创建和加强促进软件开发并防止软件缺陷的标准和方法测试 (test) 调试 (debug)
以已知条件开始,
使用预先定义的程序,
有预知的结果以不可知内部条件开始,结果一般不可预见有计划 被动的由独立的测试组,在不了解软件设计的条件下完成由程序作者进行发现错误 找出错误位置,排除测试与调试 (排错 )
软件错误分类
功能错 (需求分析错误 )
软件结构错
数据错
编码错
软件集成错
测试定义与测试执行错误
6.1.4 测试用例设计选择测试用例是软件测试员最重要的一项工作。
测试用例的属性,
属性 描述
name 测试用例的名称
location 可执行的完全路径名
input 输入数据或命令
oracle 与测试输入相比较的期待测试结果
log 测试生产的输出程序测试举例例:程序 Triangle,输入三个整数,表示一个三角形的三个边长,该程序产生一个结果,指出该三角形是等边三角形、等腰三角形还是不等边三角形。
判断三角型的测试用例设计,
输入数据 预期结果
(1) 6;6;6 等边
(2) 8;8;4 等腰
(3) 4;5;6 一般还应输入 非法数据:
0; 7; 9
-7;3; 5
a; 2; 7 等
6.1.5 软件测试信息流软件配置测试测试配置测试工具结果分析排错可靠性分析测试结果错误预期结果出错率改正的软件预测的可靠性需求规格说明书软件设计说明书被测源程序测试计划测试用例
(测试数据 )
测试驱动程序测试活动和相关工作产品项目协议对象设计 客户开发人员 用户集成策略系统分解功能性需求非功能性需求单元测试集成测试结构测试功能测试性能测试来自 ODD
来自 TP
来自 SDD
来自 RAD
来自 RAD
用户手册验收测试安装测试现场测试日常操作测试设计中需要考虑的 22种测试类型
黑盒测试
白盒测试
单元测试
累计综合测试
集成测试
功能测试
系统测试
端到端测试
健全测试
衰竭测试
接受测试
负载测试
强迫测试
性能测试
可用性测试
安装 /卸载测试
恢复测试
兼容测试
安全测试
比较测试
Alpha测试
Beta测试
6.1.6 测试的方法与技术软件测试的策略和方法静态测试方法动态测试方法人工测试方法计算机辅助静态分析方法白盒测试方法黑盒测试方法静态和动态测试汽车的检查过程,
踩油门
看车漆
打开前盖检查
发动汽车
听听发动机声音
上路行使静态测试动态测试静态测试,基本特征是在对软件进行分析、检查和审阅,不实际运行被测试的软件。
静态测试约可找出 30~ 70%的逻辑设计错误,
对 需求规格说明书,软件设计说明书,源程序做检查和审阅,包括:
是否符合标准和规范;
通过结构分析、流图分析、符号执行指出软件缺陷 ;
动态测试,通过运行软件来检验软件的动态行为和运行结果的正确性动态测试的两个基本要素:
被测试程序
测试数据(测试用例)
动态测试方法
(1)选取定义域有效值,或定义域外无效值,
(2)对已选取值决定 预期的结果
(3)用选取值执行程序
(4)执行结果 与 (2)结果相比,
不吻和程序有错,
动态黑盒测试 —闭着眼睛测试软件软件输入不深入代码细节的测试方法称为动态黑盒测试。
软件测试员充当客户来使用它。
输出动态白盒测试 —带上 X光眼镜测试软件
3581322.293419985680302829734315
250*(1+0.015)*((1+0.015)^360-1)/0.015 250*(1+0.015)*((1+0.015)^360-1)/0.015
假如知道一个盒子包含一台计算机,而另一个盒子是人用纸笔计算,就会选择不同的测试用例了解软件的运作方式会影响测试手段
§ 6.2 两种类型的测试
6.2.1 黑盒测试又称,功能测试数据驱动测试基于规格说明书的测试
6.2.2 白盒测试又称,开盒测试结构测试玻璃盒测试基于覆盖的测试,
根据被测程序的逻辑结构设计测试用例 ;
力求提高测试覆盖率 ;
黑盒测试与白盒测试比较黑盒测试 是从用户观点,按规格说明书要求的输入数据与输出数据的对应关系设计测试用例,
是根据程序 外部特征 进行测试。
白盒测试 是根据程序 内部逻辑结构 进行测试。
黑盒测试与白盒测试优缺点比较黑盒测试 白盒测试优点缺点性质
① 适用于各阶段测试
②从产品功能角度测试
③容易入手生成测试数据
① 可构成测试数据使特定程序部分得到测试
②有一定的充分性度量手段
③可或较多工具支持
① 某些代码得不到测试
②如果规格说明有误,
则无法发现
③不易进行充分性测试
① 不易生成测试数据 (通常 )
② 无法对未实现规格说明的部分进行测试
③工作量大,通常只用于单元测试,有应用局限是一种 确认 技术,回答
,我们在构造一个正确的系统吗?,
是一种 验证 技术,回答
,我们在正确 地构造一个系统吗?,
6.2.3 穷举测试例,输入 三条边长 黑盒测试可采用的测试用例数
(设字长 16位 )
执行时间,设测试一次需 1ms
共需一万年,
=2 X2 X2 ≈3X1016 16 16 14
6.2.3 穷举测试 白盒测试例,
含 4个分支,循环次数
≤ 20,从 A到 B的可能路径执行时间,设测试一次需 2ms
穷举测试需 5亿年,
=5+5 +..+5 +5
≈10
201 2 19
14
A
B
不论黑盒还是白盒测试都 不能进行穷尽测试,所以软件测试不可能发现程序中存在的所有错误,因此需精心设计测试方案,力争尽可能少的次数,测出尽可能多的错误,
黑盒测试与白盒测试能发现的错误
C BA
D
-只能用黑盒测试发现的错误A
-只能用白盒测试发现的错误
-两种方法都能发现的错误
-两种方法都不能发现的错误
BC
D
§ 6.3白盒测试的测试用例设计
6.3.1 逻辑覆盖法
(1)语句覆盖
(2)判定覆盖
(3)条件覆盖
(4)判定 /条件覆盖
(5)条件组合覆盖
(6)路径覆盖
(7)点覆盖
(8)边覆盖例,PROCEDURE SAMPAL
(A,B,REAL; VAR 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)
(A=2) OR (X>1)
返回
X=X/A
X=X+1
F
F
T
T
a
b
d
c
e
(1)语句覆盖使程序中每个语句至少执行一次语句覆盖 开始
(A>1) AND (B=0)
(A=2) OR (X>1)
返回
X=X/A
X=X+1
F
F
T
T
a
b
d
c
e
只需设计一个测试用例,
输入数据,A=2,B=0,X=4
即达到了语句覆盖 ;
语句覆盖是 最弱 的逻辑覆盖
(2)判定覆盖 (分支覆盖 )
使每个判定的真假分支都至少执行一次判定覆盖 开始
(A>1) AND (B=0)
(A=2) OR (X>1)
返回
X=X/A
X=X+1
F
F
T
T
a
b
d
c
e
例,可设计两组测试用例,
A=3,B=0,X=3 可覆盖 c,d分支
A=2,B=1,X=1 可覆盖 b,e分支两组测试用例可覆盖所有判定的真假分支语句覆盖仍是 弱 的逻辑覆盖
(3)条件覆盖使每个判定的每个条件的可能取值至少执行一次第一判定表达式,
设 条件 A>1 取真 记为 T1
假 T1
条件 B=1 取真 记为 T2
假 T2
第二判定表达式,
设 条件 A=2 取真 记为 T3
假 T3
条件 X>1 取真 记为 T4
假 T4
条件覆盖 开始
(A>1) AND (B=0)
(A=2) OR (X>1)
返回
X=X/A
X=X+1
F
F
T
T
a
b
d
c
e
满足条件,T1,T1,
T2,T2
T3,T3
T4,T4
测试用例 通过 满足的 覆盖
A B X 路径 条件 分支
1 0 3 abe T1,T2,T3,T4 b,e
2 1 1 abe T1,T2,T3,T4 b,e
两个测试用例 覆盖了四个条件八种可能取值 。
未覆盖 c,d分支,不满足判定覆盖的要求,
条件覆盖不一定包含判定覆盖判定覆盖也不一定包含条件覆盖
(4)判定 /条件覆盖选取足够多的测试用例,使判断中的每个条件的所有可能取值至少执行一次,同时每个判断本身的所有可能判断结果至少执行一次,
判定 /条件覆盖 开始
(A>1) AND (B=0)
(A=2) OR (X>1)
返回
X=X/A
X=X+1
F
F
T
T
a
b
d
c
e
满足条件,T1,T1,
T2,T2
T3,T3
T4,T4
测试用例 通过 满足的 覆盖
A B X 路径 条件 分支
2 0 4 ace T1,T2,T3,T4 c,e
2 1 1 abd T1,T2,T3,T4 b,d
能同时满足判定、条件两种覆盖标准。
取值。
测试用例 通过 满足的 覆盖
A B X 路径 条件 分支
2 0 3 ace T1,T2,T3,T4 c,e
2 1 1 abe T1,T2,T3,T4 b,e
1 0 3 abe T1,T2,T3,T4 b,e
1 1 1 abd T1,T2,T3,T4 b,d
(5)条件组合覆盖所有可能的条件取值组合至少执行一次
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
测试用例 通过 满足的 覆盖
A B X 路径 条件 分支
2 0 4 ace T1,T2,T3,T4 c,e
2 1 1 abe T1,T2,T3,T4 b,e
1 0 2 abd T1,T2,T3,T4 b,d
1 1 1 abd T1,T2,T3,T4 b,d
(6)路径覆盖覆盖每一个可能的路径测试用例 通过 满足的 覆盖
A B X 路径 条件 分支
1 1 1 abd T1,T2,T3,T4 b,d
1 1 2 abe T1,T2,T3,T4 b,e
3 0 1 acd T1,T2,T3,T4 c,d
2 0 4 ace T1,T2,T3,T4 c,e
基本路径测试法通过分析由控制构造的环路的复杂性,导出基本路径集合,从而设计测试用例,保证这些路径至少通过一次。
基本路径测试步骤:
导出程序流程图的拓扑结构 -流图
(程序图 )
计算流图 G的环路复杂度 V(G)
确定只包含独立路径的基本路径集
设计测试用例
导出程序流程图的拓扑结构 -流图
1
2,3
6 4,5
7
10
6
11
a
节点边 R4
区域
1
2
3
4
5
87
3
9
11
程序流程图
8
9
R1
R2R3
计算流图 G的环路复杂度 V(G)
V(G)= 区域个数 =4
V(G)=边的条数 -节点个数 +2=4
V(G)=判定节点个数 +1=4
确定只包含独立路径的基本路径集
path1:1-11
path1:1-2-3-4-5-10-1-11
path1:1-2-3-6-8-9-10-1-11
path1:1-2-3-6-7-9-10-1-11
一条新路径必须包含一条新边。
这 4条路径组成了一个基本路径集。 4(环路复杂度 V(G))是构成这个基本路径集的独立路径数的上界,也是设计 测试用例的数目。
设计测试用例,保证基本路径集中每条路径的执行。
§ 6.4黑盒测试的测试用例设计
6.4.1 等价类划分法把所有可能的输入数据 (有效的和无效的 )划分成若干个等价的子集
(称为等价类 ),使得每个子集中的一个典型值在测试中的作用与这一子集中所有其它值的作用相同,
可从每个子集中选取一组数据来测试程序例,某报表处理系统要求用户输入处理报表的日期,日期限制在 2001年 1
月至 2005年 12月,即系统只能对该段期间内的报表进行处理,如日期不在此范围内,则显示输入错误信息。
系统日期规定由年、月的 6位数字字符组成,前四位代表年,后两位代表月。
如何用等价类划分法设计测试用例,
来测试程序的日期检查功能?
如何划分等价类?
有效等价类 (合理等价类 )
无效等价类 (不合理等价类 )
划分等价类的标准:
覆盖
不相交
代表性划分等价类的规则
(1)如果输入条件规定了取值范围,
可定义一个有效等价类和两个无效等价类。
例 输入值是学生成绩,范围是 0~ 100
0 100
有效等价类
1≤ 成绩 ≤ 100
无效等价类成绩 >100
无效等价类成绩 <0

划分等价类的规则:
(2)如果输入条件代表集合的某个元素,则可定义一个有效等价类和一个无效等价类。
划分等价类的规则:
(3)如规定了输入数据的一组值,且程序对不同输入值做不同处理,
则每个允许的输入值是一个有效等价类,并有一个无效等价类
(所有不允许的输入值的集合 )。
例:输入条件说明学历可为,专科,本科,
硕士,博士 四种之一,则分别取这四种这四个值作为 四个有效等价类,另外把四种学历之外的任何学历作为无效等价类划分等价类的规则:
(4)如果规定了输入数据必须遵循的规则,可确定一个有效等价类 ( 符合规则 ) 和若干个无效等价类 ( 从不同角度违反规则 )。
(5)如已划分的等价类各元素在程序中的处理方式不同,则应将此等价类进一步划分成更小的等价类 。
用等价类划分法设计测试用例步骤:
(1)形成等价类表,每一等价类规定一个唯一的编号;
(2)设计一测试用例,使其尽可能多地覆盖尚未覆盖的有效等价类,
重复这一步骤,直到所有有效等价类均被测试用例所覆盖;
(3)设计一新测试用例,使其只覆盖一个无效等价类,重复这一步骤直到所有无效等价类均被覆盖;
第一步:等价类划分输入等价类 有效等价类 无效等价类报表日期的类型及长度 3位数字字符 (1)
有非数字字符 (4)
少于 6个数字字符 (5)
多于 6个数字字符 (6)
年份范围 在 2001~ 2005之间 (2) 小于 2001 (7)大于 2005 (8)
月份范围 在 1~ 12之间 (3)
“报表日期,输入条件的等价类表小于 1 (9)
大于 12 (10)
第二步,为有效等价类设计测试用例对表中编号为 1,2,3的 3个有效等价类用一个测试用例覆盖:
测试数据 期望结果 覆盖范围
200105 等价类 (1)(2)(3)输入有效第三步:为每一个无效等价类设至少计一个测试用例测试数据 期望结果 覆盖范围
001MAY 等价类 (4)输入无效
20015 等价类 (5)输入无效
2001005 等价类 (6)输入无效
200005 等价类 (7)输入无效
200805 等价类 (8)输入无效
200100 等价类 (9)输入无效
200113 等价类 (10)输入无效不能出现相同的测试用例本例的 10个等价类至少需要 8个测试用例例,对招干考试系统“输入学生成绩”
子模块设计测试用例招干考试分三个专业,准考证号第一位为专业代号,如,1-行政专业,
2-法律专业,
3-财经专业,
行政专业准考证号码为,110001~ 111215
法律专业准考证号码为,210001~ 212006
财经专业准考证号码为,310001~ 314015
例,准考证号码的等价类划分有效等价类,
(1) 110001 ~ 111215
(2) 210001 ~ 212006
(3) 310001 ~ 314015
无效等价类,
(4) -? ~ 110000
(5) 111216 ~ 210000
(6) 212007 ~ 31000
(7) 314016 ~ +?
例,计算给定月份中天数的方法接口
(java):
Class MyGregorianCalender{
……
public static in getNumDaysInMonth(int
month,int year){…}
……
}
getNumDaysInMonth( )方法有两个参数,月和年,年份的有效输入是从 0到 maxInt.
等价类划分 即把 输入空间分解成一系列子域,软件在一个子域内的行为应是等价的 。
软件错误分为两类,计算错误域错误
针对 计算错误的测试方法
针对 域错误 的测试方法,测试 域边界划定的正确性
6.4.2 边界值分析法边界值分析法与等价类划分法区别
(1)边界值分析不是从某等价类中随便挑一个作为代表,而是使这个等价类的每个边界都要作为测试条件。
(2)边界值分析不仅考虑输入条件,
还要考虑输出空间产生的测试情况被测试子 域测试内点测试外点软件边界与悬崖很类似边界条件类型如果软件测试问题包含确定的边界,那么数据类型可能是,
数值
字符
位置
数量
速度
地址
尺寸
……
还要考虑数据类型的特征,
第一个 /最后一个
最小值 /最大值
开始 /完成
空 /满
最慢 /最快
相邻 /最远
超过 /在内
……
测试边界线
测试临近边界的合法数据,以及刚超过边界的非法数据,
越界测试通常简单地加 1或很小的数
(对于最大值 )和减 1或很小的数 (对于最小值 ).
输入条件报表日期的类型及长度
1个数字字符
5个数字字符
7个数字字符有 1个非数字字符全部是非数字字符
6个数字字符显示出错显示出错显示出错显示出错显示出错输入有效日期范围月份范围
“报表日期,边界值分析法测试用 例测试用例说明 测试数据 期望结果 选取理由
5
20015
2001005
2001.5
MAY---
200105
月份为 1月月份为 12月月份 <1
月份 >12
200101
200112
200100
200113
200101
200512
200100
200513
输入有效输入有效显示出错显示出错输入有效输入有效显示出错显示出错在有效范围边界上选取数据仅有 1个合法字符比有效长度少 1
比有效长度多 1
只有 1个非法字符
6个非法字符类型及长度均有效最小日期最大日期刚好小于最小日期刚好大于最大日期最小月份最大月份刚好小于最小月份刚好大于最大月份
6.4.3 错误推测法 (error guessing)
根据经验来设计测试用例的方法例如,数据测试中的,
缺省值
空白
空值
零值

6.4.4 状态测试软件必须测试程序的状态及其转换。
测试软件的逻辑流程
建立状态转换图
减少要测试的状态及转换的数量空闲等待用户输入命令按下 Esc键显示口令框口令错误消除口令正确初始状态消失空闲等待用户输入命令按下 Esc键 口令正确口令错误不同形式的状态转换图设置 2Bwatch 上的时间的顺序图
:2Bwatch用户按下按钮 1和 2
:2Bwatch输入,2Bwatch显示,2Bwatch时间时间按下按钮 1
按下按钮 2
按下按钮 1和 2
闪烁小时闪烁分钟增加分钟刷新提交更新时间停止闪烁
2Bwatch 设置时间功能的状态图和测试结果按左按钮按右按钮按左按钮按右按钮
4,2分钟以后测量时间 设置时间电池没电
3.按下左右按钮
5.按下左右按钮 /蜂鸣
8,20年以后7,20年以后
6.2,1.
激励因素空集合 测量时间1.初始变迁测试的变迁 预期结果状态按下左边按钮 测量时间2.
同时按下两个按钮 设置时间3.
等 2分钟 测量时间4.超时
…… …………
失败状态测试找到测试软件失败的案例 。
竞争条件和时序错乱
重复
压迫
重负应联合使用,同时进行有效等价类和用来测试 getNumDaysInMonth()
方法所选的有效输入有效 等价类一个月有 31天,非闰年 19017(七月 )
一个月有 31天,闰年 19047(七月 )
一个月有 30天,非闰年 19016(六月 )
一个月有 30天,闰年 19046(六月 )
一个月为 28或 29天,非闰年 19012(二月 )
月份输入值年份输入值一个月为 28或 29天,闰年 2(二月 ) 1904
用来测试 getNumDaysInMonth()方法的附加边界值等价类可以被 400整除的闰年 20002(二月 )
可以被 100整除的非闰年 19002(二月 )
非正数无效月份 12910
正数无效月份 131513
月份输入值年份输入值
6.4.5 因果图法因果图适合于描述对于多种输入条件的组合,相应产生多个动作的形式来设计测试用例。
因果图方法最终生成的是判定表。
因果图方法实例某电力公司有 A,B,C,D四类收费标准,
并规定:
居民用电 <100度 /月 按 A类收费
≥ 100度 /月按 B类收费动力用电 <10000度 /月,非高峰,B类收费
≥ 10000度 /月,非高峰,C类收费
<10000度 /月,高峰,C类收费
≥ 10000度 /月,高峰,D类收费用因果图表明输入和输出间的逻辑关系
1 I1
2 B∨

4
A
C3
5

D
I4
I3I2 ∨∧



把因果图转换为判定表组合条件条件
(原因 )
动作
(结果 )
A
B
C
1
2
3
1 2 3 4 5 6
1
0
1
1
0
0
0
1 1
0 0 0
1 1
0 0 0 0
1 0 0 0
0 1 1 0
4 1 0 1 0
5 0 0 1 1
D 0 0 0 1
1 0
0 1
0 0
0 0
测试用例为判定表每一列设计一个测试用例,
1列 居民电,90度 /月 A
2列 居民电,110度 /月 B
3列 动力电,非高峰,8000度 /月 B
4列 动力电,非高峰,1.2万度 /月 C
5列 动力电,高峰,0.9万度 /月 C
6列 动力电,高峰,1.1万度 /月 D
条件 测试用例 预期结果组合 (输入数据 ) (输出动作 )
§ 6.5 针对专门环境和应用的测试
6.5.1 GUI测试常见 GUI测试指南:?
对于窗口?
对于菜单和鼠标操作?
对于数据项
6.5.2 C/S体系结构的 测试整体 C/S测试策略 (三个不同层次 )
客户端应以,分离的,模式被测试
(不考虑服务器和底层网络的运行 )
客户端软件和关联的服务器端应用被一起测试 (网络运行不被明显考虑 )
完整的 C/S体系结构 (包括网络运行和性能 )
被测试
C/S常用测试方法
客户端应用功能测试
服务器测试 ( 协调和数据管理功能,
性能 )
数据库测试
事务测试
网络通信测试
6.5.3 实时系统测试可采用以下四步策略:
(1) 任务测试
(2) 行为测试
(3) 任务间测试
(4) 系统测试
(1) 任务测试 (task testing)
对每一个任务进行单独测试
(白盒、黑盒测试 ),发现 逻辑和功能上错误,不能发现定时上和行为上错误 。
(2)行为 测试 (behavioral testing)
用 CASE工具创建应用系统模型,
模拟实时系统行为。
按类测试各种事件 (如中断、控制信号、数据 )。
测试过的事件以随机次序、随机频率送给系统,检查软件 行为方面的错误,
(3)任务间测试 (intertask testing)
检查 与时间有关错误 。
如用不同数据速率、处理负载测试相互通信的异步任务。
通过消息队列或数据存储测试任务间的通信来找出数据存储区错误的范围。
(4) 系统测试 (system testing)
软件、硬件组装后,找出 软、
硬件接口错误 。
软件测试的过程被测模块 单元测试设计信息集成测试被测模块 单元测试被测模块 单元测试测试过的模块确认测试系统测试软件需求其它系统元素装配好的软件确认的软件可运行的软件
§ 6.6软件测试的步骤软件测试策略单元测试U
C
D
R
S
I
V
ST
集成测试确认测试系统测试系统工程软件需求分析软件设计代码编写
6.6.1 单元测试一,单元测试的内容主要对模块的 五个基本特性 进行评价模块错误处理模块接口局部数据结构重要的执行路径 边界条件
1.常见错误类型
接口错误
I/O错误
数据结构错误
算法错误
比较及控制逻辑错误
错误处理错误
2,模块测试基本原则
至少一次测试所有语句
测试所有可能的执行或逻辑路径的组合
测试每个模块的所有入口和出口
3,确定单元测试数据集
值域
值类
离散值
值的次序集 (测试顺序文件和 表 )
二,单元测试的方法单元测试一般为编码步骤的附属部分,
模块不是独立的程序,自己不能运行,
要靠其它部分来调用和驱动,要为每个单元测试开发两个软件,
(1)驱动模块 (驱动程序 ):相当于主模块
(2)桩模块 (测试存根、连接程序 ),
代替所测模块调用的子模块单元测试的测试环境举例,
B
A
CD
E待测试模块单元测试的测试环境举例,
被测模块 B
驱动模块
(模拟模块 A)
桩模块 (测试存根 )
(模拟模块 E)
测试用例 测试结果许多模块不能用简单的软件进行充分的单元测试,此时,完全的测试可放到集成测试阶段再进行,
单元测试的测试环境举例,
实际软件华氏到慑氏转换模块温度数据实际配置测试用例数据结果测试驱动软件华氏到慑氏转换模块结果测试驱动际配置单元测试的测试环境举例温度显示模块温度接口模块实际配置 测试驱动际配置温度显示模块程序员编写的桩模块
(测试存根 )
温度值的测试文件结构性模式 (structural patterns)
适配器模式 (Adapter)—打包器 (Wrapper)
桥模式 (Bridge)—句柄 (Handle)
组合模式 (Composite)
修饰模式 (Decorator)—包装器 (Wrapper)
外观模式 (Facade)
轻量模式 (Flyweight)
代理模式 —(Proxy)
Implementor
OperationaImp( )
桥模式 (Bridge)
意图:将抽象部分和实现部分分离,使他们都可以独立地变化
Abstraction
Contextinterface( )
ConcreteImplementorA
OperationaImp( )
ConcreteImplementorB
OperationaImp( )
RefinedAbstraction
支持多种窗口系统的设计 —窗口与窗口实现分离
Window
Raise( )
DrawRact(…)
ApplicationWindow
IconWindow
DialogWindow
MacWindowlmp
DeviceRaise( )
DeviceRect(… )
……
PMWindowlmp
DeviceRaise( )
DeviceRect(… )
……
XWindowlmp
DeviceRaise( )
DeviceRect(… )
……
Windowlmp
DeviceRaise( )
DeviceRect(… )
……
利用 Bridge设计 模式与未完成、未知或在测试另一组件时不可用组件的接口( UML类图)
用户接口 数据库户接口 数据库户接口测试存根 数据库可用 Bridge设计 模式实现测试存根,用户接口子系统访问测试不能访问的数据库子系统。
将数据库接口和数据库实现分离开来。
6.6.2 集成测试 (组装测试 )
集成测试需考虑的问题,
数据穿越接口可能丢失,
一模块可能破坏另一模块功能,
子功能组装可能未产生所要求的主功能,
全程数据结构可能出问题,
误差累积问题,
集成测试方法通常采用黑盒测试技术实施策略,
非渐增式测试
渐增式测试深度优先广度优先自顶向下结合自底向上结合一,非渐增式集成方式一次就把所有通过了单元测试的模块组合在一起进行全程序的测试,
缺点,发现错误难以诊断定位,
又称,莽撞测试,,
二,渐增式集成方式从一个模块开始,测一次添加一个模块,边组装边测试,以发现与接口相联系的问题 。
自顶向下结合方式举例,
A
DB
E
模块测试结合顺序
C
F
深度优先,A,B,E,C,D,F
广度优先,A,B,C,D,E,F
自顶向下结合方式举例,(深度优先 )
A
测试 A
S2S1 S3
A
加入 B
S2B S3
S4
A
加入 E
S2B S3
E
A
加入 C
CB S3
E
加入 D
CB D
E
加入 F
CB D
E
A A
FS5
自底向上结合方式举例,
A
CB D
FE
E
d1
C
d3
F
d4
B
d2
E
D
d5
F
自底向上结合方式举例,
Mc
D1
Ma Mb
D2 D3
簇 1
簇 2
簇 3
自顶向下 自底向上优点 可在测试早期 设计测试用例容易实现并验证系统主要功能不需驱动模块 不需桩模块缺点 需桩模块 只有到最后程序才能作为一个整体
3,混合集成测试方法
一般对软件结构的上层使用自顶向下结合的方法 ;
对下层使用自底向上结合的方法 ;