1、第8章 面向对象软件测试策略,本章要点,8.1面向对象的基本特征,面向对象的基本特征是:抽象、继承、封装、重载、多态。具体概念和相互关系如图8.1所示。,8.2 面向对象软件的测试策略,8.2.1 面向对象的单元测试,在前面介绍的很多单元测试方法可以直接用于类测试。例如: 每个类都包含变量。在黑盒测试方法中介绍的边界值分析法和等价类划分都可以使用,以保证使用最有效的测试数据发现尽可能多的缺陷。 并不是所有方法都要由客户执行。可以使用白盒测试方法中介绍的功能覆盖方法,以保证每个方法都能执行。 每个类都拥有具有过程逻辑的方法。在白盒测试方法中介绍的条件覆盖技术、分支覆盖技术、代码复杂性分析等都可以
2、使用,以保证覆盖尽可能多的分支和条件,增加代码的可维护性。 由于类要由不同的客户实例化很多次,所以各种压力测试技术都可以实施,以尽早的发现与压力有关的问题,例如内存泄漏,进行系统测试和验收测试。,8.2.2 面向对象的集成测试,在面向对象系统的集成测试中需要注意以下几点: 面向对象系统本质上是通过小的、可重用的组件构成。因此,集成测试对于面向对象系统来说更重要。 面向对象系统下组件的开发一般更具并行性,因此对频繁集成的要求更高。 由于并行性提高,集成测试时需要考虑类的完成顺序,也需要设计驱动器来模拟外没有完成的类功能。,8.2.3 面向对象的系统测试,面向对象系统测试有三个主要目的: 验证产品
3、交付的组件和系统性能能否达到要求。 定位产品的容量以及边界限制。 定位系统性能瓶颈。 由于系统测试需要搭建与用户实际使用环境相同的测试平台,以保证被测系统的完整性,所以,对临时没有的系统设备部件,也需要有相应的模拟手段。,8.2.4 面向对象系统的回归测试,测试用例库的维护 删除过时的测试用例 改进不受控制的测试用例 删除冗余的测试用例 增添新的测试用例,回归测试包的选择 再测试全部用例 基于风险选择测试 基于操作剖面选择测试 再测试修改的部分,8.2.5 面向对象测试的相关模型,有一些模型可以帮助面向对象系统的测试,主要包括: 用例 类图 序列图 活动图,8.3 面向对象软件的测试用例设计,
4、相比于传统的结构化程序测试通过软件的【输入】-【处理】-【输出】视图或者单个模块的算法细节来设计测试用例的方式,面向对象测试侧重于设计适当的操作序列来检查类的状态。 面向对象编程可能对测试有几种方式的影响,依赖于面向对象编程的方法, 某些类型的故障变得就不可能(不值得去测试); 某些类型的故障变得更加可能(值得进行测试); 出现某些新的故障类型。,8.4 网站测试,网站测试是一组相关的活动,这些活动具有共同的目标: 发现网站的内容、功能、可用性、导航性、性能、容量以及安全方面存在的错误。为实现这个目标,要将同时包括评审及可运行测试的测试策略应用于整个网站系统的开发过程中。参与测试的人员包括所有
5、参加网站测试的网站开发工程师,以及项目的经理、客户和最终用户。 在进行网站测试时,首先关注的是用户可见的方面,之后进行技术及基础结构方面的测试。这里要进行6个步骤的测试: 内容、界面、构件、配置、性能及安全测试。在测试过程中,需要制定测试计划,要为每一个测试步骤开发一组测试用例,并且要对记录了测试结果的文档进行维护,以备将来使用。,8.4.1 网站测试概念,评估和测试都要检查质量维度中的一项或多项: 内容:在语法及语义层对内容进行评估。在语法层,对基于文本的文件进行拼写、标点及文法方面的评估;在语义层,正确性、一致性及清晰性都要评估。 功能:对功能进行测试,试图发现与客户需求不一致的错误。对每
6、一项网站功能,评定其正确性、不稳定性及与相应的现实标准(例如,Java或XML、Javascript语言标准)的总体符合程度。 结构:对功能进行评估,以保证它正确地表示网站的内容及功能是可扩展的,及支持新内容、新功能的增加。 可用性:对可用性进行测试,以保证接口支持各种类型的用户,各种用户都能够学会及使用所有的导航语法及语义。 导航性:对导航性进行测试,以保证检测所有的导航语法及语义,发现任何导航错误(例如,死链接、不合适的链接、错误链接等)。 性能:在各种不同的操作条件、配置及负载下,对性能进行测试,以保证系统响应用户的交互并处理极端的负载情况,而且没有出现不可接受的操作上的性能降低。 兼容
7、性:在客户端及服务器端,在各种不同的主机配置下,通过运行网站对兼容性进行测试,目的是发现针对特定主机配置的错误。 互操作性:对互操作性进行测试,以保证网站与其他系统和数据库有正确接口。 安全性:对安全性进行测试,通过评定可能存在的弱点,试图对每一个弱点进行攻击。任何成功的突破尝试都被认为是一个安全漏洞。,8.4.1 网站测试概念,下面的步骤对此方法进行了总结: 对网站的内容模型进行评审,以发现错误。 对接口模型进行评审,以保证适合所有的用例。 评审网站的设计模型,以发现导航错误。 测试用户界面,以发现表现机制和导航机制中的错误。 对选择的功能构件进行单元测试。 对贯穿体系结构的导航进行测试。
8、在各种不同的环境下,实现网站运行,并测试网站对于每一种配置的兼容性。 进行安全性测试,试图攻击网站或其所处环境的弱点。 进行性能测试。 通过可监控的最终用户群体对网站进行测试;通常对他们与系统的交互结果进行评估,包括内容和导航错误、可用性、兼容性、网站的可靠性及性能等方面的评估,8.4.2 网站测试过程,8.4.3 数据库测试,为了完成此任务,需要以下的步骤: 查询信息管理数据库; 从数据库中抽取相关的数据; 将抽取的数据组织为一个内容对象; 将这个内容对象(代表某个最终用户请求的指定信息)传送到客户环境显示。,8.4.3 数据库测试,导致网站的数据库测试的复杂性以及重要性主要有以下因素: 客
9、户端请求的原始信息很少能够以被输入到数据库管理系统中的形式表示出来。 数据库可能离装载网站的服务器很远。因此应该设计测试,用来发现网站和远程数据库之间的通信所存在的问题。 从数据库中获取的原始数据一定要传递给网站服务器,并且这些原始数据要被正确地格式化,以便接下来传递给客户端。因此,应该设计测试,用来证明网站服务器接受到的原始数据的有效性,并且还要生成另外的测试,证明转换的有效性,将这种转换应用于原始数据,能够生成有效的内容。 动态内容对象一定要以能够显示给最终用户的形式传递给客户端。因此,应该设计一系列的测试,用来发现内容对象格式方面的错误;以及测试与不同的客户环境配置的兼容性。,8.4.3
10、 数据库测试,考虑到以上的四个因素,对于图8.3中记录的每一个“交互层”,都应该设计相应的测试用例。测试应该保证: 有效信息通过界面层在客户端与服务器之间传递; 网站正确地处理脚本,并且正确地抽取或格式化用户数据; 用户数据被正确地传递给服务器端的数据转换功能,此功能将合适的查询格式化(例如,SQL); 查询被传递到数据管理层,此层与数据库访问程序通信。,8.4.4 用户界面测试,1测试界面机制 链接:对每一个导航链接进行测试,确保获得了正确的内容对象或功能。 表单:测试应该确保:(1)表单域有合适的宽度和数据类型;(2)表单建立了合适的安全措施,防止用户输入的文本字符串长度大于某预先定义的最
11、大值;(3)对下拉菜单中的所有合适的选项进行详细说明,并按照对最终用户有意义的方式排列;(4)浏览器“自动填充”特性不会导致数据输入错误;(5)tab键或其他键能够实现焦点在表单域之间的正确移动。 客户端脚本:当脚本运行时,使用黑盒测试发现处理中的一些错误。 动态HTML:运行保护动态HTML的每个网页,确保动态显示正确。另外,应该进行兼容性测试,确保动态HTML在支持网站环境配置中正常执行。 流动内容:测试应该证明流动数据是最新的,并且显示正确,能够无错误的暂停,而且很容易的重新启动。 Cookie:服务器端的测试和客户端的测试都需要。在服务器端,测试应该确保一个cookie被正确的构造,并
12、且当请求特定的内容和功能时,该cookie能够被正确地传送到客户端。此外,测试此cookie是否具有合适的持续性,确保有效期正确。 对于用户界面的测试还包括了一些其他方面,如弹出窗口测试、特定于界面机制的应用、界面语义测试等。这些测试方法需要在今后的测试实践中,结合实际的应用进行探索和研究。,8.4.4 用户界面测试,2可用性测试 可用性测试可以由网站开发团队来设计,但是测试本身由最终用户进行。在测试时,可以采用下面的步骤: 定义一组可用性测试类别,并确定每类测试的目标。 设计测试,使其能够评估每个目标。 选择将执行测试的测试参与者。 当进行测试时,指导参与者与网站的交互。 开发一种机制来评估
13、网站的可用性。,下面通过举例的方式说明测试类别及目标: 交互性交互机制(例如,下拉菜单、按钮、指针)容易理解和使用吗? 布局导航机制、内容和功能放置的方式是否能够让用户很快地找到它们? 可读性文本是否很好地编写,并且容易理解?图形表示是否容易理解? 美学布局、颜色、字体和相关特性是否使网站美观并易于使用?用户是否在应用时感觉舒适? 显示特性网站是否使屏幕的大小和分辨率得到了最佳使用? 个性化网站是否能适应多种用户或个别用户的特殊要求?,8.4.6 配置测试,1服务器端问题 网站与服务器操作系统完全兼容吗? 当网站运行时,系统文件、目录和相关的系统数据是否被正确的创建? 系统安全措施(例如,防火
14、墙或加密)允许网站运行,并对用户提供服务,而不发生冲突或性能下降吗? 是否已经对所选择的具有分布式服务器配置的网站进行了测试? 对网站是否与数据库软件进行了适当的集成?是否对数据库的不同版本敏感? 服务器端的网站脚本运行正常吗? 系统管理员的错误对网站运行的影响是否已经被检查? 如果使用了代理服务器,在端点测试时,是否已经明确了这些代理服务器在配置方面的差异?,2客户端问题 硬件,CPU、内存、存储器和打印设备。 操作系统,Linux、Macintosh操作系统、Microsoft Windows、基于移动的操作系统。 浏览器软件,Internet Explorer、Mozilla、Opera
15、、Chrome等。 用户界面构件,ActiveX、Java applets、Flash等。 插件,QuickTime、RealPlayer等。 连接性,电缆、DSL、常规的调制解调器等。 除了这些构件,其他配置变量包括网络软件、ISP的难以预测的变化及并发运行的应用系统。,8.4.7 安全性测试,为了防止这些攻击,可以实现以下一种或多种安全机制: 防火墙,是硬件和软件相结合的过滤机制,它能检查每一个进来的信息包,确保信息包来自合法的信息源,阻止任何可疑的数据。 鉴定,确认所有客户和服务器身份的一种验证机制,只有当两端都通过检验才允许通信。 加密,保护敏感数据的一种编码机制,通过对敏感数据进行某
16、种方式的修改,使得怀有恶意的人不能读懂。通过使用数字证书,加密得到了增强,因为数字证书允许客户对数据传输的目标地址进行检验。 授权,一种过滤机制,只有那些具有合适的授权码(例如,用户ID和密码)的人,才允许访问客户或服务器环境。,8.4.8 系统测试,1性能测试的目标 服务器响应时间是否降到了值得注意的或不可接受的程度? 在什么情况下,性能变得不可接受? 哪些系统构件应对性能下降负责? 在多种负载的条件下,对用户的平均响应时间是多少? 性能下降是否影响系统的安全性? 当系统的负载增加时,网站的可靠性和精确性是否会受影响? 当负载大于服务器容量的最大值时,会发生什么情况?为了得到这些问题的答案,
17、要进行两种不同的性能测试: 负载测试在多种负载级别和多种组合下,对真实世界的负载进行测试。 压力测试将负载增加到强度极限,以此来确定网站环境能够处理的容量。,8.4.8 系统测试,2负载测试 负载测试的目的是确定网站和服务器环境如何响应不同的负载条件。当进行测试时,下面变量的排列定义了一组测试条件: N,并发用户数量; T,每用户、每单位时间在线事务数量; D,每次事务服务器的数据负载。 负载测试也可以用于为网站用户估测建议连接速度。以下面的方式计算总的吞吐量P:,8.4.8 系统测试,3压力测试 压力测试是负载测试的继续,但是,在压力测试中,需要使变量N、T和D满足操作极限,然后超过操作极限
18、。这些测试的目的要求回答下面的问题: 系统“逐渐”降级吗?或者,当容量超出时,服务器停机吗? 服务器软件会给出“服务器不可用”的提示信息吗?更一般地说,用户知道他们不能访问服务器吗? 服务器队列请求增加资源吗?一旦容量要求减少,会释放队列所占用的资源吗? 当容量超出时,事务会丢失吗? 当容量超出时,数据的完整性会受影响吗? N、T和D的哪些值可迫使服务器环境失效?如何来证明失效了?自动通知会被发送到位于服务器站点的技术支持那里吗? 如果系统失效,需要多长时间才能够恢复呢? 当容量达到80%或90%时,某些网站功能会被停止吗?,本章习题,面向对象具备哪些基本特征?每个基本特征的原理是什么? 面向对象测试中主要包括哪些测试过程?每个测试过程的目的是什么? 为什么说类进行彻底的单元测试相比于面向过程系统更为重要? 面向对象系统集成测试中需要注意哪些事项? 面向对象系统测试的目的是什么? 面向对象编程依赖于面向对象编程的方法可能对测试有哪些影响? 网站测试主要包括哪些步骤和要素? 网站测试的每个过程的测试目标是什么?主要采用哪些方法? 性能测试的目标是什么?与负载测试的区别是什么?,