第七章
1)了解程序设计语言选择方法及编码风格
随便看看吧
2)软件测试的定义、目的
定义1:软件测试是为了发现错误而执行程序的过程
定义2:软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计的一批测试用例(Test Cases),并利用这些测试用例运行程序以及发现错误的过程,即执行测试步骤
测试是为了发现程序中的错误而执行程序的过程
好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案
成功的测试是发现了至今为止尚未发现的错误的测试
在综合测试阶段通常由其他人员组成测试小组来完成测试工作
测试只能查找出程序的错误,不能证明程序中没有错误
3)各种测试方法
a.划分:
按照软件测试用例的设计方法来划分:
白盒/结构测试(White-box/Structural Testing)
黑盒/功能测试(Black-box/Functional Testing)
按照软件测试的策略和过程来分类,软件测试可分为
单元/模块/部件测试(Unit/Module/Component Testing)
集成/接口/组装测试(Integration/Interface/Assembly Testing)
系统测试(System Testing)
确认/验收测试(Validation/Acceptance Testing)
b.测试步骤
模块测试(又称单元测试 发现编码 和详细设计的错误 大量使用白盒测试技术 复杂性受内聚程度影响)->子系统测试(经过单元测试的模块放在一起形成一个子系统)->系统测试(子系统放在一起... 发现软件设计和需求说明中的错误 与前者并称集成测试 黑盒为主 主要路径可白盒)->确认测试(要有用户积极参与 以用户为主 能够发现系统需求说明书错误 仅使用黑盒技术 最终保证 α测试由用户在开发者的场所进行,并且在开发者对用户的“指导”下进行测试 β测试由最终用户在一(多)个客户场所进行)->平行运行(同时运行新开发出来的系统和被它取代的旧系统,以便比较新旧两个系统的处理结果)
c.代码审查
审查小组最好由下述四人组成:
组长(没有直接参与工程,且能力很强的程序员)
程序的设计者
程序的编写者
程序的测试者
方法:审查会 “预排”
d.驱动程序 存根概念
通常驱动程序也就是一个“主程序”,它接收测试数据,把这些数据传送给被测试的模块,并且印出有关的结果
存根程序代替被测试的模块所调用的模块。因此存根程序也可以称为“虚拟子程序”
e.集成测试:
分为一次性组装和渐增性组装。
渐增性组装又包括:
自顶向下:
1. 对主控制模块进行测试,测试时用存根程序代替所有直接附属于主控制模块的模块
2. 根据选定的结合策略(深度优先或宽度优先),每次用一个实际模块代换一个存根程序(新结合进来的模块往往又需要新的存根程序)
3. 在结合进一个模块的同时进行测试
4. 为了保证加入模块没有引进新的错误,可能需要进行回归测试(即,全部或部分地重复以前做过的测试)
从第二步开始不断地重复进行上述过程,直到构造起完整的软件结构为止
自底向上:
1. 把低层模块组合成实现某特定软件子功能的族
2.写一个驱动程序(用于测试的控制程序),协调测试数据的输入和输出
3.对由模块组成的子功能族进行测试
4.去掉驱动程序,沿软件结构自下向上移动,把子功能族组合起来形成更大的子功能族
上述第2步到第4步实质上构成了一个循环
对比:
自顶向下
优点
不需要测试驱动程序
能够在测试阶段的早期实现并验证系统的主要功能
能在早期发现上层模块的接口错误
缺点
需要存根程序
低层关键模块中的错误发现比较晚
不能充分展开人力
自底向上的优缺点与自顶向下的测试方法正好相反
有改进方案 综合使用二者
使用思路:确定关键模块并尽早测试关键模块
关键模块的特征: ① 满足某些软件需求 ② 在程序的模块结构中位于较高的层次(高层控制模块)③ 较复杂、较易发生错误 ④ 有明确定义的性能要求
f.回归测试:所谓回归测试是指重新执行已经做过的测试的某个子集,以保证上述这些变化没有带来非预期的副作用
4)白盒测试(重点)
白盒测试法(又称结构测试法)的前提是可以把程序看成装在一个透明的白盒子里,也就是完全了解程序的结构和处理过程
a.掌握各种逻辑覆盖测试的概念和测试用例设计
语句覆盖:选择足够多的测试数据,使被测程序中每个语句至少执行一次
用例[(2,0, 4),(2, 0, 3)] 覆盖sacbed
判定覆盖:每个判定的每个分支都至少执行一次
用例【(2, 0, 4),(2, 0, 3)】覆盖 sacbed 【(1, 1, 1),(1, 1, 1)】覆盖 sabd
条件覆盖:不仅每个语句至少执行一次,而且使判定表达式中的每个条件都取到各种可能的结果
用例 A=2,B=0,X=4
(满足A>1,B=0,A=2,X>1的条件,执行路径sacbed)
A=1,B=1,X=1
(满足A<=1,B!=0,A!=2,X<=1的条件,执行路径sabd)
判定/条件覆盖:判定覆盖条件覆盖并不互相包含,因此使用....,原理是选取足够多的测试数据,使得判定表达式中的每个条件都取到各种可能的值,而且每个判定表达式也都取到各种可能的结果
用例 A=2,B=0,X=4
(满足A>1,B=0,A=2,X>1的条
件,执行路径sacbed,a=T; b=T)
A=1,B=1,X=1
(满足A<=1,B!=0,A!=2,X<=1
的条件,执行路径sabd, a=F; b=F)
条件组合覆盖:要求选取足够多的测试数据,使得每个判定表达式中条件的各种可能组合都至少出现一次
覆盖中最强,但不一定每条路径都覆盖到
路径覆盖:覆盖每条路径
b.掌握基本路径测试
步骤:
1.根据过程设计结果画出相应的流图
2.计算流图的环形复杂度
3.确定线性独立路径的基本集合
4.设计可强制执行基本集合中每条路径测试用例(之前有必要识别出判定点)
c.条件测试:条件测试技术设计出的测试用例,能够检查程序模块中包含的逻辑条件
d.循环测试:注意针对简单循环、嵌套循环和串接循环的方法
5)黑盒测试(重点)
黑盒测试着重测试软件的功能需求,也就是说,黑盒测试让软件工程师设计出能充分检查程序所有功能需求的输入条件集
a.等价划分
等价划分(Equivalence Partitioning)是一种黑盒测试方法,这种方法把程序的输入域划分成数据类,据此可以导出测试用例
一个理想的测试用例能独自发现一类错误(例如,对所有字符数据的处理都不正确)
如果把所有可能的输入数据(有效的和无效的)划分成若干个等价类(Equivalence Sets),则可以合理地做出下述假定:
每类中的一个典型值在测试中的作用与这一类中所有其他值的作用相同
因此,可以从每个等价类中只取一组数据作为测试数据。这样选取的测试数据最有代表性,最可能发现程序中的错误
启发式规则:
如果规定了输入值的范围,则可划分出一个有效的等价类(输入值在此范围内),两个无效的等价类(输入值小于最小值或大于最大值)
如果规定了输入数据的个数,则类似地也可以划分出一个有效的等价类和两个无效的等价类
如果规定了输入数据的一组值,而且程序对不同输入值做不同处理,则每个允许的输入值是一个有效的等价类,此外还有一个无效的等价类(任一个不允许的输入值)
如果规定了输入数据必须遵循的规则,则可以划分出一个有效的等价类(符合规则)和若干个无效的等价类(从各种不同角度违反规则)
如果规定了输入数据为整型,则可以划分出正整数、零和负整数等三个有效类
如果程序的处理对象是表格,则应该使用空表,以及含一项或多项的表
b.边界值分析
如规定输入输出条件范围,则选取的测试数据应该刚好等于、刚刚小于和刚刚大于边界值
如规定输入0<=n<=100,则选0,100,-1,101作为测试数据
如果规定了输入输出个数,则分别选最大个数,最小个数,比最大个数多1,比最小个数少1作为测试数据
如规定学生至少选5门课,至多选9门课,则选5, 9, 4, 10作为测试数据
如果输入输出为有序集合,如文件或表格,应将注意力集中在有序集的第一个和最后一个元素
如果程序中定义的数据结构有预定义的边界,如数组的上下界,则选择刚好打到边界和刚好超出边界的数据为测试数据
c.因果图判定表(随便看看)
6)调试:调试(也称为纠错, Debug)作为成功的测试的后果而出现,即调试是在测试发现错误之后排除错误的过程
一般有以下三种路径可以采用:
蛮干法:打印内存数据、关键输出、断点
回溯法:由症状回推可能的原因
原因排除法:对分查找、归纳、演绎等方法
7)软件可靠性
a.
软件可靠性
软件可靠性是程序在给定的时间间隔内,按照规格说明书的规定成功地运行的概率。
软件可用性:
b.平均无故障时间(重点)