目录
1.引论
1.1软件测试的必要性
软件测试是软件质量保证的重要手段之一
在整个软件生命周期中,每个阶段都存在软件测试活动,软件测试伴随着软件开发,以检验每一个阶段性的成果是否符合质量要求和达到预先定义的目标,尽可能早的发现错误并及时修正。
1.2关于软件测试正反两方的观点
(1)正向思维
代表:Bill Hetzel博士
观点:软件测试就是一系列活动,这些活动就是为了评估一个程序或软件系统的特性或能力,并确定其是否达到了预期效果
(2)反向思维
代表:Glenford.L.Myers
观点:测试是为了发现错误而执行的一个程序或者系统的过程
1.3软件测试的定义
使用人工或自动手段来运行或测定某个系统的过程,其目的在于检验他是否满足规定的需求或是弄清预期结果与实际情况的差别。
上面明确提到软件测试是以检验是否满足需求为目标
软件测试是由“验证”和“有效性确认”活动确认的整体
“验证”:是否实现产品规划书所定义的系统功能和特性
“有效性确认”:是否满足用户的真正需求
1.4软件测试的原因
保证软件产品质量
- 软件中总存在各种各样的缺陷
- 越早发现软件中存在的问题,开发费用就会很低
- 测试是软件开发的重要组成部分
- 测试人员水平越高,找到问题的时间就越早,软件就更容易改正
1.5软件测试的其他观点、测试和质量保证(SQA)的关系
1.经济观点
以最小的代价获得最高的软件产品质量
2.测试和质量保证的关系
测试是技术,质量保证是管理
软件测试为SQA提供数据和依据,帮助SQA更好的了解质量计划的执行情况、过程质量、产品质量和过程改进进展,从而使SQA更好的进行下一步工作
软件质量保证的职能是向管理层提供正确的可视化信息,从而促进与协助流程改进‘
二者都贯穿整个软件开发生命周期的流程
但是SQA是一项管理工作,侧重于对流程的评审和监控,而测试是一项技术性的工作,侧重于对产品的评估和验证。
1.6测试驱动开发(TDD)
测试在先,编码在后的开发方法
测试驱动开发强调测试先行,使开发人员对代码有足够的信心,同时也有勇气进行代码重构
2.软件测试基本概念
2.1软件测试模型
1.V模型
描述了基本的开发过程与测试过程,主要反映了测试活动分析与设计之间的关系。
2.W模型
由V模型演变而来,强调测试应伴随整个软件生命周期,有利于尽早的发现问题。
2.2软件质量的内含
软件质量的定义:
软件产品满足规定的和隐含的与需求能力有关的全部特征和特性,包括:
-
- 软件产品质量满足用要求的程度
- 软件各种属性的组合程度
- 用户对软件产品综合反映程度
- 软件在使用的过程中满足用户要求的程度
2.3内部质量、外部质量、使用质量之间的关系
2.4测试方法
静态测试和动态测试
静态测试包括对软件产品的需求和设计规划说书的评审、对代码的审查以及静态分析等
动态测试是通过真正运行程序发现问题,通过观察代码的运行,来判断系统是否存在缺陷
需求评审:主要审查需求是否完整、正确、清晰。是软件开发成败的关键
主动测试和被动测试
主动测试:测试人员主动向被测试对象发送请求、或借助数据、事件驱动被测试对象的行为,从而验证被测试对象的反应或输出结果。在主动测试中,由于被测试对象受人为因素影响较大,而且一般在测试环境中进行,所以不适合产品在线测试。
被动测试:软件产品运行在实际环境中,测试人员不干预产品运行,只是检测产品的运行,使用一定的被动机制来获得数据。
白盒测试和黑盒测试
白盒测试:已知产品内部工作过程,清楚程序结构及其语句,按照内部结构测试程序,测试程序内部的变量状态、逻辑结构、运行路劲等。查看程序内部运行是否设计规格要求、各部分是否按规定正常进行。
黑盒测试:在不考虑程序内部结构和内部特征的情况下,,测试人员对软件直接进行测试,检查其是否能按照规格说明书正常使用,是否能输出正确结果,是否满足规范要求等。
针对不同对象的四种组合测试方法
2.5优秀软件工程师应具备的素质
-
- 责任感
- 沟通能力
- 技术能力
- 自信心
- 耐心
- 怀疑精神
- 适度的好奇心
- 洞察力
- 反向思维和发散思维能力
- 记忆力
3.软件测试方法
3.1基于直觉和经验的方法
自由测试与ALAC测试(向客户那样做)
经济观点与二八原则
3.2基于输入域的方法
3.2.1等价类划分法(黑盒方法)
基本思想:用一组有限的数据去代表近似无限的数据
等价类划分法就是解决如何选择适当的数据子集来代表整个数据集的问题
3.2.2边界值分析法
边界值分析法就是在某个输入输出变量范围的边界上,验证系统功能是否正常运行的测试方法
由于错误最容易发生在边界值附近,所以边界值分析法对多变量函数的测试很有效
例如一个排序程序的边界值例子:
- 排序序列为空,
- 排序序列仅有一个数据,
- 排序序列为最长序列,
- 排序序列按要求排好序,
- 排序序列的顺序与要求刚好相反,
- 序列中所有值相等。
3.3基于组合及其优化方法
3.3.1判定表方法
判定表的制作步骤:
- 列出所有的动作桩和条件桩
- 填入条件项
- 填入动作项,制定初始判定表
- 简化、合并相似规则或相同动作
3.3.2因果图法
因果图是一种形式化的图形语言,不仅能发现输入输出中的错误,还能指出程序规范中的不完全性和二义性。
3.4基于逻辑覆盖的方法
3.4.1判定覆盖
判定覆盖的基本思想是设计若干用例,运行被测试程序,使得程序中每个判断的取真分支和取假分支至少经历一次,即判断真假值均曾被满足。
3.4.2条件覆盖
条件覆盖的基本思想是设计若干测试用例,执行被测试程序后,要使每个判断中每个条件的可能取值至少满足一次。
3.4.3判定-条件覆盖
设计足够的测试用例,使得判断条件中的所有条件可能取值至少执行一次,同时,所有判断的可能结果至少执行一次。
3.4.4条件组合覆盖
基本思想:设计足够多的测试用例,使得判断中每个条件的所有可能至少出现一次。
与条件覆盖的区别在于它并不是单独要求每个条件都出现“真”与“假”两种结果,而是要求这些结果的所有可能组合都至少出现一次
3.4.5基本路径覆盖
基本路径覆盖就是设计所有的测试用例,来覆盖程序中所有的可能的、独立的执行路径
3.5基于缺陷模式的测试(概念)
在软件测试中,如果知道其缺陷模式,就可以根据缺陷模式进行匹配,然后发现类似的问题,这就是基于缺陷模式的测试。
3.5.1常见的缺陷模式
- 故障模式
- 安全漏洞模式
- 并发缺陷模式
- 不良习惯模式
- 代码国际化模式
- 易诱骗代码模式
3.7.2形式化验证
使用形式化验证,就是根据某些形式规范或属性,使用数学方法证明其正确性或非正确性
只有通过形式化验证过程可以证明一个系统不存在某个缺陷或者证明一个系统符合某个属性。但是,仍然无法证明某个系统没有缺陷,这是因为不能形式化的定义“没有缺陷”。所以我们能做的就是证明一个系统不存在可以想象到的缺陷,以及验证满足系统质量要求的属性。
4.软件测试流程和规范
4.1传统的软件测试过程
4.2敏捷测试
敏捷测试是符合敏捷测试宣言的思想,遵守敏捷开发原则,在敏捷开发环境下能很好地和其他整体开发流程融合的一系列的测试实践。
4.2.1敏捷测试与传统测试的区别概括如下:
- 传统测试更强调测试的独立性,将开发人员和测试人员分的比较清除;在敏捷测试方法中,可以没有测试人员角色,强调整个团队对测试负责;
- 传统软件测试更具有阶段性,但敏捷测试的过程中持续性更加显著;
- 传统测试强调测试的计划性,敏捷测试更强调速度和适应性,侧重不断调整以适应需求变化;
- 传统测试强调测试是由“验证”和“确认”两部分组成,敏捷测试以用户为中心,时刻不离用户需求;
- 传统测试强调任何缺陷都要记录下来,敏捷测试不太关注对缺陷的记录和跟踪;
- 传统测试更关注缺陷,敏捷测试更关注产品本身
- 传统测试鼓励自动化,但自动化测试成功与否对测试没有致命影响。然而自动化测试是敏捷测试的基础,敏捷测试的持续性迫切要求测试的高度自由。
4.2.2敏捷测试的流程
4.5测试改进过程
4.5.1 TMMi-测试成熟度模型
过程能力描述了遵循一个软件过程可能达到的预期结果的范围。
过程一致性检查可以从以下三个方面实施:
- 执行过程的适宜性检查
- 已定义过程的应用度量
- 过程评审和纠正
TMM的建立得益于以下三点:
- 充分吸收CMM的精华,
- 基于历史演化的测试过程,
- 业界的最佳实践
5.单元测试与集成测试
5.2静态测试
5.2.1编码的标准和规范
坚持标准和规范的原因:
- 可靠性
- 可读性和可维护性
- 移植性
5.2.2代码评审
代码评审也是一种有效的测试方法,不仅能有效的发现缺陷,而且为缺陷预防获取各种经验
- 代码走查:一种相对正式的代码评审过程,设计者或者程序员引导小组成员通读编码,其他成员提出问题并对可能的错误等进行评论
- 正式会议审查:一种最为正式的检查和评估方法,生成静态分析错误报告。
5.7集成测试的模式
非渐增式测试模式:
先分别测试每个模块,再把所有的模块按设计要求放在一起结合成所要的程序。
渐增式的测试模式:
把下一个要测试的模块同已经测试好的模块结合起来进行测试,测试是在模块一个一个的扩展下进行的,其测试范围逐步增大。
这两种模式的优缺点(KAO)
- 渐增式测试需要编写的软件较多,工作量大,非渐增式测试开销小。
- 渐增式测试模式发现模块间接口错误早;而非渐增式测试模式晚。
- 非渐增式测试模式发现错误,较难诊断;渐增式测试模式,如果发现错误则往往和最近加进来的模式相关。
- 渐增式测试模式测试更彻底。
- 渐增式测试模式需要较多的机器时间
- 使用非渐增式测试可以实现并行测试
5.8自顶向下和自底向集成方式
自顶向下:
从主控模块(主程序)开始,沿着软件的控制层次向下 移动,从而逐渐把各个模块结合起开。
自底向上:
测试从"原子"模块(即软件结构最低层的模块)开始集 成已进行测试
5.9 混合策略(三明治集成方法)
优点:
他是将自顶向下和自底向上的集成方法有机地结合起来,不需要写桩程序,因为测试初自底向上的集成已经验证了底层模块的正确性。
缺点:
在真正集成之前每一个独立的模块没有完全被测试过
6.性能测试
6.1性能测试的基本过程
7.软件本地化测试
软件本地化与国际化
先有国际化后有本地化