软件测试
1 软件测试概述
1.1 软件发展史
① 程序设计阶段
② 程序系统阶段
③ 软件工程阶段
④ 客户端/服务器(C/S)体系结构
1.2 软件缺陷
★符合下面4个规则之一就是软件缺陷。
① 软件未达到软件规格说明书中规定的功能
② 软件出现了产品说明书中指明不会出现的错误;
③ 软件功能超出了产品说明书中指明的范围
④ 软件测试人员认为软件难于理解,不易使用,运行速度慢,或者最终用户认为软件使用效果不好
★软件缺陷的类型:
功能 影响了各种系统功能、逻辑的缺陷
用户界面 影响了用户界面、人机交互特性,包括屏幕格式、用户输入输出等
文档 影响发布和维护,包括注释,用户手册,设计文档
软件包 由于软件配置库、变更管理或版本控制引起的错误
性能 不满足系统可测量的属性值,如执行时间,事务处理速率等。
系统/模块接口 与其他组件、模块或设备驱动程序、调用参数、控制块或参数列表等不匹配、冲突。
1.3 软件测试
为什么要进行软件测试:因为软件测试可以确保软件质量,随着软件趋向大型化、高复杂度,软件的质量越来越重要,软件测试可以发现软件缺陷、评估软件质量、保证高质量的软件开发过程。
IEEE给软件测试的定义:以手工或自动的方式,对被测对象进行检测的活动,目的是查看被检对象是否满足用户的需求,或者实际效果与预期效果的差异。
★1.3.1 软件测试目的
① 测试是想以最少的时间和人力,系统地找出软件中潜在的各种缺陷,通过修正缺陷提高软件质量,回避软件发布后由于潜在缺陷造成的隐患所带来的商业风险
② 测试的附带收获是,它能够证明软件的功能和性能是否与需求说明书相符合
③ 实施测试收集到的测试结果数据为可靠性分析提供了依据
④ 测试不能表明软件中不存在错误,它只能说明软件中存在错误。
★1.3.2 软件测试原则
① 证伪而不是证真
② 尽早地和不断地进行软件测试
③ 重视无效数据和非预期测试:测试用例包含有效和无效
④ 测试用例应包含输入的相应输出
⑤ 对每一个测试结果做全面的检查
⑥ 测试现场保护和资料归档
⑦ 程序员应当避免检查自己的程序
⑧ 充分注意测试中的集群现象:发现错误多,残存错误也多
⑨ 严格执行测试计划,排除测试的随意性
⑩ 妥善保存测试计划,测试用例,出错和最终分析报告,为维护提供方便。测试用例要定期评审适时补充修改
★1.3.3 软件测试分类
① 按测试阶段划分
底层:(a)单元测试 (b)集成测试
高层:(c)确认测试 (d)系统测试 (e)验收测试
② 按执行状态划分
(a)静态测试 (b)动态测试
③ 按测试技术分
(a)黑盒测试 (b)白盒测试 (c)灰盒测试
④ 按测试执行主体分
a) 开发方测试/验收测试/ α测试
b) 用户测试/β测试
c) 第三方测试/独立测试
1.3.4 软件测试模型
① V模型
② W模型
③ H模型
④ X模型
⑤ 前置模型
1.3.5 测试用例
★测试用例(Test Case)是指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。
内容:测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等
★设计准则:经济、有效、多重、完备、可判断、可再现
★属性:优先级、目标性、关联性、阶段性、状态性、时效性、所属范围、所有者。
★测试用例的设计步骤:
1.制定测试用例的策略和思想,在测试计划中描述出来。
2. 设计测试用例的框架,也就是测试用例的结构
3. 细化结构,逐步设计出具体的测试用例
4. 通过测试用例的评审,不断优化测试用例
★2 软件测试流程
2.1 测试计划
根据用户需求报告中关于功能要求和性能指标的规格说明书,定义相应的测试需求报告,使得随后所有的测试工作都将围绕着测试需求来进行。同时,指定①测试范围,②测试策略(测试模型、黑盒/白盒、人工/自动),③测试资源(人员、硬件、软件等)、④进度安排、⑤风险及对策。
2.2 测试设计
测试设计是指将测试计划阶段制订的测试需求分解、细化为若干个可执行的测试过程,并为每个测试过程选择适当的①测试技术方案、②测试用例、③测试环境,保证测试结果的有效性。
2.3 单元测试/模块测试
★单元测试的任务:
① 模块接口测试——对被测模块,检测数据能否正确无误地进入和流出模块;
② 模块局部数据结构测试——检测模块在工作过程中,其内部数据能否保持其完整性,包括内部数据的内容、形式以及相互之间关系;
③ 模块边界条件测试——检测在数据边界处,模块能否正常工作;
④ 覆盖测试——检测模块运行能否满足特定的逻辑覆盖;
⑤ 出错处理检测——检测模块出错处理是否有效。
辅助模块:
由于每个模块在整个软件中并不是孤立的,在对每个模块进行单元测试时,需要考虑它和周围模块的相互联系。为模拟这一联系,在进行单元测试时,必须设置若干个辅助测试模块。这些辅助模块分为两种:
驱动模块(driver): 用以模拟被测模块上级模块,相当于被测模块的主程序。
桩模块(stub): 用以模拟被测模块的下级模块,相当于被测模块调用的子模块。
2.4 集成测试
一些模块单独能够工作,并不能保证连接起来也能正常工作。 程序在某些局部反映不出的问题,在全局上很可能暴露出来,影响功能的发挥。
★可能的原因有:
① 模块相互调用时引入了新的问题;
② 几个子功能组合起来不能实现主功能;
③ 误差不断积累达到不可接受的程度;
④ 全局数据结构出现错误等。
集成测试的任务主要就是排除以上出现的问题
2.4.1 非增式测试
独立地测试该程序的每个模块,然后再把它们组合成整个程序的方法
特点:工作量大,需要的机器时间较少,所有模块可以同时进行并行测试
2.4.2 增式测试
把下一个待测试的模块组合到已经测试过的那些模块上去,再进行测试的方法
特点:查找故障比较容易,能够较早地检查出模块之间接口的错误,更彻底地对程序进行测试
① 自顶向下:从主控模块开始,按照软件的控制层次结构,逐步把各个模块集成在一起。
② 自底向上:最下层的模块开始,按照程序的层次结构,逐渐形成完整的整体
③ 三明治集成:结合以上两者,采取持续集成策略
★2.5 系统测试
是对整个系统的测试,将硬件、软件、操作人员看作一个整体,检验它是否有不符合系统说明书的地方。
系统测试的目标不是要找出软件故障,而是要证明系统的性能
★2.6 验收测试
验收测试是将最终产品与最终用户的当前需求进行比较的过程,是软件开发结束后,软件产品向用户交付之前进行的最后一次质量检验活动,回答开发的软件产品是否符合预期的各项要求,用户是否接受等问题。
验收测试不只检验软件某方面的质量,还要进行全面的质量检验并决定软件是否合格。因此验收测试是一项严格的正规的测试活动,并且应该在生产环境中而不是开发环境中进行。
★2.7 回归测试
回归测试是对程序进行测试以确定是否因故障修复而引入了新的故障
2.8 测试评估
评估测试的主要评测方法有测试覆盖、质量评测和性能评测
① 测试覆盖是对测试完全程度的评测,由测试需求和测试用例的覆盖或已执行代码的覆盖表示。
② 质量评测是对软件系统的可靠性、稳定性以及性能的评测,对测试结果的评估和对测试过程中确定的变更请求进行分析。
③ 性能评测检测软件运行时的性能,如传输的最长时间限制、传输的错误率、计算的精度、相应的时限和恢复时限等。
3 黑盒测试/功能测试/正确性测试
检查软件的功能是否符合规格说明
3.1 等价类划分
把程序的输入域划分成若干个互不相交的子集——等价类(输入域的子集合)
★为什么要划分等价类:
表示整个输入域提供了一种形式的完备性,
而互不相交则可保证一种形式的无冗余性。
① 有效等价类:合理输入
② 无效等价类:不合理输入
根据已列出的等价类表,按以下步骤确定测试用例:
1)为每个等价类规定一个唯一的编号。
2) 设计一个新的测试用例,尽可能多地覆盖尚未被覆盖的有效等价类,重复这一步,直到测试用例覆盖了所有的有效等价类。
3) 设计一个新的测试用例,使其覆盖并且只覆盖一个还没有被覆盖的无效等价类。重复这一步,直至测试用例覆盖了所有的无效等价类。
3.2 边界值分析
大量的故障发生在输入或输出范围的边界上,而不是在输入范围的内部。
使用边界值分析方法设计测试用例:
1) 首先应确定输入等价类与输出等价类的边界情况。
2) 选取正好等于,刚刚大于,或刚刚小于边界的值做为测试数据
3.3 决策表测试
在所有的黑盒测试方法中,基于决策表的测试是最严格,最具有逻辑严格性的测试方法。
构造决策表的5个步骤:
1)确定规则的个数。每个条件可取两个取值,故应有2n种规则。
2)列出所有的条件桩和动作桩。
3)填入条件项。
4)填入动作项,这样便可得到初始决策表。
5)化简,合并相似规则后得到决策表。
3.4 因果图
因果图方法适合于描述对于多种条件的组合,产生多个相应动作的测试方法
3.5 场景法
3.6 错误推测法
4 白盒测试/结构化测试
4.1 静态测试
① 代码检查
② 静态结构分析
4.2 代码质量度量
① 代码覆盖率
② 代码度量方法
4.3 逻辑覆盖
① 语句覆盖:每条语句都能执行
② 判断覆盖:每个判断至少取真和假各一次
③ 条件覆盖:每个判断中的每个条件的可能取值至少一次
④ 条件判断覆盖:①+②
⑤ 修正条件/判断覆盖:①+②+③
⑥ 条件组合覆盖:②+③+④
⑦ 路径覆盖:覆盖每条路径,工作量指数级增长
4.4 路径分析
4.5 控制结构测试
4.6 数据流测试
数据流测试是指一个基于通过程序的控制流,从建立的数据目标状态的序列中发现异常的结构测试方法。数据流测试用作路径测试的“真实性检查”。
4.7 程序插桩
在软件测试中,常常要用到一种“插桩”技术,通过在源代码中加入记录信息语句,以便进行运行信息的追踪和调试,统计有关的运行资源状况
5 性能测试
性能测试目的:评估能力、识别弱点、系统调优
★5.1 性能指标:
响应时间
并发用户数
吞吐量
性能计数器
休眠时间
点击率
★5.2 性能测试分类
性能测试
强度测试
安全性测试:检查系统对非法侵入的防范能力.
恢复测试:检查系统的容错能力
安装测试:找出在安装过程中出现的错误,而不是软件故障
可靠性测试:
配置测试:保证测试的软件可以使用尽量多样化的硬件组合
可用性测试:检测用户使用软件是否满意,让软件适合于用户的实际工作风格
优秀的用户界面包括7个要素:
1、符合标准和规范 2、直观性 3、一致性 4、灵活性 5、舒适性 6、正确性 7、实用性
兼容性测试:检测软件之间能否正确地交互和共享信息,保证软件按照用户期望的方式进行交互,是用其他软件检查软件操作的过程。
1. 软件要求与哪种操作系统、Web浏览器和应用软件保持兼容?如果要测试的软件是一个平台,那么设计要求什么样的应用程序能在它上面运行?
2. 应该遵守哪种定义软件之间交互的标准或者规范?
3. 软件使用何种数据与其他平台和软件进行交互和共享信息?
文档资料测试
6 网站测试
★一般网页测试包括以下几方面内容:
① 文字测试
② 链接测试
③ 图形测试
④ 表单测试
⑤ 动态内容测试
⑥ 数据库测试
⑦ 服务器性能和加载测试
⑧ 安全性测试
Website性能测试测:
各种操作的响应速度
最大并发用户数
最大数据容量
网站测试囊括许多领域,包括配置测试,兼容性测试、可用性测试、文档测试、黑盒测试、白盒测试、静态和动态测试。
7 软件测试自动化
它是相对手工测试而存在的,主要是通过所开发的软件测试工具、脚本等来实现,具有良好的可操作性、可重复性和高效率等特点。
自动化测试的必要性:
① 软件测试的工作量很大;
② 测试中的许多操作是重复性的、非智力性的和非创造性的,并要求做准确细致的工作;
自动化测试的适用情况:
① 回归测试;
② 大量不同数据输入的功能测试;
③ 用手工测试完成难度较大的测试,如性能测试、负载测试、强度测试等。
自动化测试的优点:
① 提高了测试执行速度,节省了时间。
② 提高了测试效率。
③ 提高了准确度和精确度。
④ 更好地利用资源。
⑤ 模拟测试条件。
☆7.1 测试工具
② 性能测试(负载)工具:LoadRunner
LoadRunner中有三大高手:
1、VUGen(Virtual User Generator):模拟用户
2、Controller(性能测试的司令部):
负责生成测试场景
管理和协调用户
联机监测系统的各个节点的性能,收集数据
发送给Analysis分析
3、Analysis:
整合测试数据
分析它们之间的关系
用图表,把数据分析结果表现出来
9 面向对象测试
★9.1 面向对象影响测试
面向对象技术的封装、继承、多态和动态绑定等特性一方面提高了软件开发效率,保证了软件都质量,但另一方面也给软件测试提出了新的问题,增加了测试的难度和复杂性。
① 封装性影响测试:由于信息隐蔽与封装机制,类的内部属性和状态对外界是不可见的,只能通过类自身的方法获得,这给类测试时测试用例执行是否处于预期状态的判断带来困难
② 继承性影响测试:继承有利于代码的复用,但同时也使错误传播概率提高。
③ 多态性影响测试:多态促成了子类型替换。一方面,子类型替换使对象的状态难以确定。另一方面,子类型替换使得向父类对象发送的消息也允许向子类对象发送。