软件测试教案.ppt

上传人:牧羊曲112 文档编号:6434315 上传时间:2023-10-30 格式:PPT 页数:86 大小:3.19MB
返回 下载 相关 举报
软件测试教案.ppt_第1页
第1页 / 共86页
软件测试教案.ppt_第2页
第2页 / 共86页
软件测试教案.ppt_第3页
第3页 / 共86页
软件测试教案.ppt_第4页
第4页 / 共86页
软件测试教案.ppt_第5页
第5页 / 共86页
点击查看更多>>
资源描述

《软件测试教案.ppt》由会员分享,可在线阅读,更多相关《软件测试教案.ppt(86页珍藏版)》请在三一办公上搜索。

1、第五章 特定环境及应用测试,软件测试概论Software Testing韩启龙,第5章 特定环境及应用测试,5.1 客户/服务器体系结构测试5.2 图形用户界面GUI测试5.3 实时系统测试5.4 面向对象软件的测试,本章教学目标,理论环节认识和理解特定环境及应用的测试掌握客户/服务器体系结构测试方法掌握图形用户界面GUI测试内容认识和理解实时系统测试认识和理解OO的软件测试基本概念和基本知识掌握面向对象软件测试的常用方法实践环节掌握对Web进行的压力测试掌握类的数据流测试,重点设置登录服务器的网络设置,5.1 客户/服务器体系结构测试,5.1.1 客户/服务器体系结构测试方法5.1.2 We

2、b网站的测试5.1.3 对Web进行压力测试5.1.4 使用WAS进行Web负载测试,Return,5.1.1 客户/服务器体系结构测试方法,从宏观上说,C/S体系结构的软件测试通常是从单个客户端开始,然后再逐步集成客户端、服务器和网络系统进行集成测试,最后进行系统的整体测试。即从以下三个层面来进行C/S系统的测试:(1)客户端的独立测试 对客户端的测试主要是属于功能性测试。用户客户端应用以“分离的”模式被测试,即这层测试不考虑服务器和底层网络的运行。通常包括:客户端的测试检测客户端的业务逻辑流程的应用,客户端的独立测试,操作系统平台测试在各种系统平台上进行兼容性测试。目前有很多不同的操作系统

3、,如Windows、Unix和Linux等。CS应用系统的最终用户使用哪种操作系统,取决于用户系统的配置。这样就可能会发生兼容性问题,即同一个应用在某些操作系统下能正常运行,但在另一个操作系统下可能失败。因此,需要在各种操作系统下对客户端系统进行兼容性测试。,客户端的独立测试,浏览器测试在CS结构的应用体系中,客户端的业务逻辑程序均由浏览器承担完成时,对客户端应用程序的测试就表现为对浏览器的测试。在应用广泛的Web应用系统中,浏览器是系统客户端的核心构件,来自不同厂商的浏览器对Java、JavaScript、ActiveX或不同的HTML规格由不同的支持。例如,ActiveX是Microsof

4、t的产品,是为IE而设计的,JavaScript是Netscape的产品,Java是Sun的产品等。另外,框架和层次结构风格在不同的浏览器中也有不同的显示,甚至根本不能显示。不同的浏览器对安全性和Java的设置也不一样。测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中,测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。,客户/服务器体系结构测试方法(续),(2)客户端与服务器端的集成测试 客户端软件和关联的服务器端应用作一体测试,但并不过多考虑网络运行的关联因素。对服务器的测试主要是性能的测试。测试包含服务器的协调和数据管理功能以及服务器的性能(整体响应时间和数据的吞吐量)的

5、表现。通常包括:数据库测试、连接速度测试、负载测试、压力测试。对应用服务器(中间件)的测试 对C/S系统的集成测试一般采用非增量式的方法完成。此外,C/S测试必须考虑面向对象的测试技术,尤其是C/S系统基本上都采用了GUI(图形用户界面)。,客户/服务器体系结构测试方法(续),(3)整体测试 对完整的C/S体系结构整体测试,在上述功能测试和性能测试的基础上,还包括网络运行及其性能的测试。整体测试通常包括以下测试项目:事务测试创建一系列的测试以保证每类事务被按照需求处理。事务测试着重于处理的正确性,同时也关注性能问题。网络通信测试用于验证网络节点间的通信是否正常的发生,并且消息传递、事务和相关的

6、网络通信有无错误的发生。,5.1.2 Web网站的测试,基于 Web 的系统测试不但需要检查和验证是否按照设计的要求运行,而且还要评价系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测试,从功能、性能、可用性、客户端兼容性、安全性等方面讨论了基于Web的系统测试方法。对Web网站测试所采用的测试方法与策略有哪些?黑盒测试、白盒测试、静态测试和动态测试都有可能用到,还会包括面向对象测试技术的运用。Web网站的测试是一项复杂的任务,如何进行?最初的起点是把网页或整个网站当作一个黑盒子。,例子Apple公司的网站,花一些时间看看Apple公司的网站,考虑如何对

7、其进行测试,测试什么?不测试什么?看了网站之后,决定做什么?如果看到站点地图(,网页的特性,不同大小、字体和颜色的文字图形和图象超级联接文字和图形、图象动态变化的广告下拉式选择框动态下拉式选择框用户输入数据或信息的方框,自定义的布局,允许用户更改信息在屏幕中的位置自定义的内容,允许用户选择想看的新闻和信息动态变化的文字与不同浏览器、浏览器版本以及硬件和软件平台的兼容性,网页测试,文字测试:检查用户等级、术语、内容、准确度以及内容的时效性。链接测试:测试所有链接是否能按照指示的那样正确链接到应当链接的页面;测试所链接的页面是否存在;确保不存在孤立页面(即没有链接指向的页面)。图形、图像测试:确保

8、有明确的用途;颜色的搭配;图片的大小和质量;所有图形是否能够正确载入和显示。表单测试:检测域的大小;数据接收是否正确;可选域是否真正可选;提交操作的完整性等。动态内容测试(要求能查看到程序源代码)Cookies测试:Cookies是否起作用;是否按预定的时间进行保存;刷新对Cookies有何影响等。,网站测试,数据库测试:在使用了数据库的Web系统中,测试由用户提交的表单信息不正确而引起的数据一致性问题;测试由网络速度或程序设计等问题引起的输出故障。服务器性能及负载(压力)测试:通过应用模拟的方法实现,即通过某种程序方法(工具软件)模拟上万个链接和下载来判断服务器的响应时间、并发访问数量等性能

9、与负载能力。安全性测试:测试有效和无效的用户名和密码;测试Web应用系统是否有超时的限制;测试相关信息是否写进了日志文件、是否可追踪;在使用了安全类型套接字时,测试加密是否正确;在没有经过授权时,测试是否能拒绝在服务器端放置和编辑脚本。易用性测试:包括整体界面测试、导航测试等。,网站易用性测试,易用性和网站有时是相互排斥的术语。大家都见过难以进入的、过期的、显示速度慢的或者简陋不堪的网页。毫无疑问,这些站点可能从未被软件测试员看到过。某些设计经验甚少的人创建网页并上传,让全世界观看,没有去想它们是否好用。易用性测试是难以定义的过程。一个人认为不行,另一个人可能认为很好有人认为绒布上的图案是艺术

10、品。万幸的是,遵守和测试一些基本规则有助于使网站更加易用。,网站易用性测试(续),Jakob Nielsen()是网站设计和易用性研究方面的专家,他对网站易用性进行深入的研究。以下清单摘自他的Top Ten Mistakes in Web Design:,使用不成熟技术滚动文字、滚动块和不停运行的动画滚动显示的长页面不标准的链接颜色过期信息,过长的下载时间缺少导航支持孤页复杂的网站地址URL使用框架,网站易用性测试(续),使用不成熟技术。网站不应该靠吹嘘采用最新Web技术来吸引用户。这样可能会吸引一些不用脑子的人,但是主流用户会更加关心有用的内容以及站点提供良好客户服务的能力。使用未发布的最新

11、、最佳技术肯定会使用户受到打击;如果他们在访问该网站时系统崩溃,那么可以断言大部分人不会再回来了。除非从事因特网产品和服务销售业务,否则最好等到该技术具有一些使用经验之后再采用,网站易用性测试(续),滚动文字、滚动块和不停运行的动画。不要让网页上有不停移动的元素。移动的图像对人类的视觉太过刺激。网页不应该像纽约城的时代广场那样不断刺激人们的感官让用户安安静静地看文字吧!,网站易用性测试(续),滚动显示的长页面。当一个页面出现时,用户通常不喜欢滚动查看屏幕上看不见的信息。所有重要的内容和导航选项应该位于页面顶端。最近研究表明,与早期Web应用相比,用户越来越喜欢滚动查看了,但是在导航页上减少滚动

12、仍然是好的建议。,网站易用性测试(续),不标准的链接颜色。指向用户未曾看过的页面超级链接应该是蓝色;指向已经看过的页面链接应该是紫色或者红色。不要乱用这些颜色,因为了解哪个链接已经跟进过的能力是大多数Web浏览器标准的导航目的。告诉用户链接颜色的含义关键是一致性。,网站易用性测试(续),过期信息。开发小组应该有一个Web“园丁”随着网站变化除草和栽花。遗憾的是,大多数小组宁肯花时间创建新内容也不愿意进行维护。实际上,维护是加强网站内容的经济之道,因为许多老的网页保持原有的关联,应该与新的网页建立链接。当然,某些网页在终止日期之后最好从服务器上彻底删掉。,网站易用性测试(续),过长的下载时间。传

13、统的人为因素规范指出,0.1秒是用户感觉系统反应不连贯的极限。1秒是用户感觉不快的极限。10秒是用户完全丧失兴趣的最长响应时间。在Web上,用户已经被磨练地能够忍受更长时间,对于一些网页最长可接受时间增加到15秒。但是,不要以此为目标把目标定得更高一些。,网站易用性测试(续),缺少导航支持。不要假设用户也知道站点要干什么。他们总是难以找到信息,因此需要明确结构和位置形式的支持。站点设计应该从很好地了解信息空间的结构开始,并把结构明确地传达给用户。为用户提供站点地图,使其清楚目前的位置,哪里可以达到。站点还应该具有良好的搜索特性,因为即使最好的导航支持也不一定够用。,网站易用性测试(续),孤页。

14、所有网页一定要包含本身所属哪个网站的明确指示,因为用户可能不经过主页而直接访问网页。同样的原因,每个网页都应该与主页链接,以及它在信息空间结构的位置指示。,网站易用性测试(续),复杂的网站地址URL(uniform resource locator)。像URL这样的机器级寻址虽然永远不会显露在用户界面上,但是,经研究发现用户实际上设法解码网页的URL,以推断网站的结构。用户这样做是因为缺少导航支持和不明当前Web浏览器中位置的意义。因此,URL应该包含便于人们阅读的名称以反映网站内容的本质。此外,用户还常常会输入URL,因此网站应该设法减少使用特殊字符(许多人不知道怎样输入)带来的输入错误风险

15、。,网站易用性测试(续),使用框架。框架是允许在一个网站中显示其他网站的HTML技术,框架由此得名与图文框类似。把网页分割为框架会使用户迷惑,因为框架打破了网页的用户模式。突然之间当前网页不能加书签,也不能返回了(书签指向另一个框架组),URL不再有效,打印输出发生困难。更糟糕的是,用户操作的预见性消失了用户随时随地单击一个链接;谁知道会显示什么信息?,网站易用性测试(续),如果测试网站,就要充分利用测试员的权限报告易用性方面的软件缺陷。回顾基本用户界面设计技术,了解易用性的组成要素。这方面的好资料是题为”Improve Web Sites Usability and Appal”的Micro

16、soft研究文档。其网址是。该文档提供了Microsoft在设计其MSN网站内容时发现的好经验。不要因为该文档的日期是1997年就弃之不要。好的设计不受时间限制。,5.1.3 对Web进行压力测试,Web服务测试原理Web压力测试 压力测试是系统测试的一部分,要被设计为通过应用很大的工作负载来使软件超负荷运转,其目的是要弄清楚被测试的Web服务是不是不仅能做预期应能做的事,而且在被施加了某些高强度压力的情况下仍能继续正常运行。如果压力测试通过对软件保持高强度的使用(不超过性能统计数字确定的限制)能够有效执行,那么它就经常能够发现许多其它测试无法发现的隐蔽错误。压力下的错误类型内存泄露通常要求操

17、作重复非常多的次数后才会出现并发与同步在同一时间执行多个测试,对Web进行压力测试(续),图 Web服务测试原理,对Web进行压力测试(续),有效的压力测试系统的关键条件重复:就是一遍又一遍地执行某个操作或功能。这将确定一个操作能否正常执行,并且能否继续在每次执行时都表现正常。并发:就是在同一时间内执行多个操作。由并发引起的错误只能通过执行多个代码示例才能测出来,测试时要同时遍历多条代码路径。量级:要考虑到每个操作中的负载量,操作自身应尽可能给被测软件系统增加压力,即:尽量使单独的操作进行高强度的使用,增加操作的量级。随机变化:随机使用前面条件中的无数变化形式,就能够在每次测试运行时应用许多不

18、同的代码路径。,5.1.4 使用WAS进行Web负载测试,负载测试是任何Web 应用开发周期中一个重要的环节。在构造一个为大量用户服务的应用之前,搞清楚产品配置能够承受多大的负载非常重要。但是在实际开发过程中,若要按照实际投入运行的情况,组织成千上万的用户来进行压力测试,无论从那个方面看,都是不现实的。为了有效的对Web应用程序进行负载(压力)测试,微软公司发布了简单易用、功能强大的Web应用负载测试工具WAS(Web Application Stress Tool),它能够提供一种简单的方法模拟大量用户进行访问目标网站,而且还能够提供Web应用程序工作时对硬件和软件的使用情况。如何使用WAS

19、进行Web负载测试?,5.2 图形用户界面GUI测试,由于GUI开发环境采用了较多可重用的组件,因此在开发用户界面时高效、省时而且精确;但由于GUI的复杂性,增加了对这类情形的软件进行测试的难度,从而也加大了设计和执行测试用例的难度。目前,针对GUI的测试技术基本上都是采用自动化测试工具来实现。具体测试工作中,GUI测试经常需要考虑以下的测试内容和方法:窗体操作测试下拉式菜单和鼠标操作测试数据项操作测试,窗体测试,窗体控件的大小、对齐方向、颜色、背景等属性的设置值是否和程序设计要求相一致窗体控件布局是否合理、美观,窗体控件TAB顺序是否从左到右,从上到下。窗体焦点是否按照编程规范落在既定的控件

20、上窗体画面文字(全、半角、格式、拼写)是否正确窗体大小能够改变、移动或滚动,能否响应相关的输入或菜单命令窗体中的数据内容能否用鼠标、功能键、方向键和键盘操作访问显示多个窗体时,窗体名称能否正确表示,活动窗体是否被加亮,窗体测试(续),多用户联机时所有窗体是否能够实时更新,窗体声音及提示是否符合既定编程规则相关的下拉菜单、工具条、滚动条、对话框、按钮及其它控制是否能够正确并完全可用鼠标无规则点击时是否会产生无法预料的结果当被覆盖并重新调用后,窗体能否正确的再生需要时能否使用所有窗体相关的功能,所有窗体相关的功能是可操作的窗体能否被正确关闭,下拉式菜单和鼠标操作测试,应用程序的菜单条是否显示系统相

21、关的特性(例如时钟显示)是否适当地列出了所有的菜单功能和下拉式子功能菜单功能是否正确执行菜单功能的名字是否具有自解释性,菜单项是否有帮助,是否语境相关菜单条、调色板和工具条是否在合适的语境中正常显示和工作下拉式菜单相关操作是否使用正常,功能是否正确,下拉式菜单和鼠标操作测试(续),能否通过鼠标来访问完成所有的菜单功能能否通过用其他的文本命令激活每个菜单功能菜单功能能否随着当前的窗体操作加亮或变灰在整个交互式语境中,是否可正确识别鼠标操作,如果要求多次单击鼠标,或鼠标有多个按钮光标、处理指示器和识别指针能否随操作而相应改变鼠标有多个形状时,是否能够被窗体识别(如漏斗状时窗体是否接受输入),数据项

22、操作测试,图形用户界面(GUI)测试中,针对数据项的操作主要有以下几个方面数据项(数字、字母)能否正确回显,并输入到系统中图形模式的数据项(如滚动条)是否能正常工作数据输入消息是否得到正确的理解,能否识别非法数据数据输入消息是否可理解,5.3 实时系统测试,实时系统:将硬件、软件、人力和数据库元素集成起来,产生某种动作响应外部世界。在实时系统中,时间是交互的核心,它必须高速地获得数据,并在问题域规定的时间框架内对该问题域做出相应的处理。实时系统测试的特殊性和复杂性:实时系统的时间依赖性和异步性给测试带来新的困难。测试用例的设计者考虑的不仅是白盒和黑盒测试用例,而且包括事件处理(如中断处理)、数

23、据的时间序列以及处理数据的任务(进程)的并发性。很多情况下,提供的测试数据有时使得实时系统在某状态下可以正常运行,而同样的数据在系统处于不同状态时有时又会导致错误。实时系统的软件和硬件之间存在着密切关系,测试时必须考虑硬件故障对软件处理的影响,但这种故障很难实时仿真。,实时系统测试(续),实时系统测试的一般步骤:任务测试:测试实时系统的第一步是独立的测试各个任务。对每一个任务设计白盒和黑盒测试用例,并在测试时执行每个任务。任务测试能够发现逻辑和功能错误,但是不能发现时间和行为错误。行为测试:利用 CASE 工具创建软件模型,就可能仿真实时系统,并按照外部事件的序列检查其行为,这些分析活动可作为

24、创建实时系统时设计测试用例的基础。任务间测试:在隔离了任务内部和系统行为错误以后,测试就要转向时间相关的错误。用不同的数据率和处理负载来测试与其他任务通讯的异步任务,看任务间的同步是否会产生错误。另外,测试通过消息队列和数据存储进行通讯的任务,以发现这些数据存储区区域大小方面的错误。系统测试:集成软件和硬件,并进行大范围的系统测试,以发现软件/硬件接口间的错误。,5.4 面向对象软件的测试,5.4.1 面向对象的基本概念5.4.2 面向对象的软件测试与传统软件测试5.4.3 面向对象软件测试模型5.4.4 类的功能性测试和结构性测试5.4.5 状态转移图的面向对象软件测试5.4.6 类的延伸测

25、试,5.4.1 面向对象的基本概念,对象类消息接口继承多态和动态绑定,对象,对象是指包含了一组属性以及对这些属性的操作的封装体。属性可以是数据,也可以是另一个对象;每个对象都有它自己的属性值,表示该对象的状态;对象中的属性只能通过该对象所提供的操作来存取或修改。对象所具有的状态、行为、标识三个基本特征,分别对应于对象的属性、方法和对象名。对象是软件开发期间测试的直接目标。面向对象软件测试所关注的焦点:(1)对象的行为是否符合它的规定说明;(2)该对象与和它相关的对象是否协同工作。,类,类是具有相同属性和相同行为的对象的集合。面向对象程序运行的基本元素是对象,而类则是用来定义对象这一基本元素的。

26、在面向对象程序设计中,类是一个独立的程序单位,它有一个类名,还包括用于描述对象属性的成员变量和用于描述对象行为的成员函数。类是对象的抽象定义,它定义了用户将要如何创建对象的方法。使用类时必须先实例化用对象名创建类的实例,再通过这个对象去访问类的成员变量,去调用类的成员函数。,消息,消息是对象的操作将要执行的一种请求,也被称为成员函数调用或者方法调用。面向对象程序的执行实际上是执行一个由消息连接起来的方法序列。“发送消息M到对象N”=“调用N对象的M方法”一个对象通过向另一个对象发送消息来请求其服务,对象之间的协同工作是通过互相传送消息来完成的。一个消息通常包括接收对象名、调用的操作名和适当参数

27、(如有必要)。消息只告诉接收对象需要完成什么操作,但并不指示接收者怎样去完成操作。消息完全由接收者解释,接收者独立决定采用什么方法来完成所需操作。,消息(续),从测试的角度看,关于消息有下面的结论:(1)消息的发送者决定何时进行发送消息,可能会做出错误的决定;(2)消息的接收者可能收到非预期的特定消息,并做出不正确地反映;(3)消息可能含有参数。在处理一条消息时,参数能被接收者使用或修改。若传递的参数是对象,那么在消息被处理前和处理后,对象必须处于正确的状态,而且必须是接收者所期望的接口。,接口,接口是行为声明的集合。接口是由一些规范构成的,规范定义了类的一套完整的公共行为。从测试的角度,关于

28、接口有下面的结论:(1)接口封装了操作的说明。如果这一接口包含的行为和类的行为不相符,那么这一接口的说明就有问题。(2)接口非孤立,它与其它的接口和类有一定的关系。一个接口可以指定一个行为的参数类型,使得实现该接口的类可以被当作一个参数进行传递。,继承,继承是指在某个类的层次关联中,不同的类共享属性和操作的一种机制。继承允许一个新的类(称为子类)在一个已有的类(称为父类或者基类)的基础上进行定义。一个父类可以有多个子类,这些子类都是父类的特例。父类描述了这些子类的公共属性和操作,子类中还可以定义它自己的属性和操作。从测试的角度来看,继承包含以下内容:(1)继承提供一种机制,通过这种机制,潜在的

29、错误能够从一个类传递到它的派生类。(2)子类是从父类继承过来的,子类也就继承了父类的属性和操作。因此,可以用测试父类的方法对子类进行测试。,多态和动态绑定,多态是指同一个操作作用于不同的对象可以有不同的解释,产生不同的执行结果。多态提供了将类看作是一种或多种类型的能力,它定义了用来支持多种不同类型所适应的策略。多态可分为特定类型和通用类型两类,其中特定类型包括:强制和重载两类;通用类型包括:包含多态与参数多态两类(多态说明)。与多态密切相关的一个概念就是动态绑定。传统程序设计语言把过程调用与目标代码的连接放在程序运行前进行,称为静态绑定。而动态绑定则是把这种连接推迟到运行时才进行。在程序运行过

30、程中,当一个对象发送消息请求服务时,要根据接收对象的具体情况将请求的操作与实现的方法进行连接,即动态绑定。,5.4.2 面向对象的软件测试与传统软件测试,面向对象技术所独有的封装、继承、多态等新特点给测试带来一系列新的问题,增加了测试的难度。与传统的面向过程的程序设计相比,面向对象程序设计产生错误的可能性增大,或者使得传统软件测试中的重点不再那么突出,使原来测试经验和实践证明的次要方面成为了主要问题。例如:函数 y=Function(x)如果该函数写在传统的面向过程的程序中,通常考虑的是函数Function()本身的行为特点。但若写在面向对象的程序中,就不得不同时考虑基类函数Base:Func

31、tion()的行为和继承类函数Derived:Function()的行为。,面向对象技术的特点给测试带来的新问题具体表现为:(1)封装把数据及对数据的操作封装在一起,限制了对象属性对外的透明性和外界对它的操作权限,在某种程度上避免了对数据的非法操作,有效防止了故障的扩散。但同时,封装机制也给测试数据的生成、测试路径的选取以及测试结构的分析带来了困难。(2)继承实现了共享父类中定义的数据和操作,同时也可定义新的特征。子类是在新的环境中存在,所以父类的正确性不能保证子类的正确性。继承使代码的重用率得到了提高,但同时也使故障的传播几率增加。(3)多态和动态绑定增加了系统运行中可能的执行路径,而且给面

32、向对象软件带来了严重的不确定性,给测试覆盖率的活动带来新的困难。,面向对象的软件测试与传统软件测试(续),与传统软件相比,由于存在的诸如继承、关联、动态绑定等关系,面向对象软件具有更复杂的依赖关系,一个类将不可避免的依赖于其它的类,从而增加了面向对象软件测试的难度。传统软件中存在的依赖关系有:变量间的数据依赖;模块间的调用依赖;变量与其类型间的定义依赖;模块与其变量间的功能依赖。面向对象软件除了存在上述依赖关系外,还存在以下的依赖关系:类与类间的依赖;类与操作间的依赖;类与消息间的依赖;类与变量间的依赖;操作与变量间的依赖;操作与消息间的依赖;操作与操作间的依赖。,面向对象的软件测试与传统软件

33、测试(续),5.4.3 面向对象软件测试模型,面向对象的程序结构不再是传统的功能模块结构,作为一个整体,原有集成测试所要求的逐步将开发的模块搭建在一起进行测试的方法已变得不可行。而且,面向对象软件抛弃了传统的开发模式,对每个开发阶段都有不同以往的要求和结果,已经不可能用功能细化的观点来检测面向对象分析和设计的结果。因此,传统的测试模型对面向对象软件已经不再适用。面向对象的软件开发模型将开发过程定义为面向对象分析(OOA)、面向对象设计(OOD)和面向对象编程(OOP)三个阶段。针对这种开发模型,应该建立一种新的测试模型。,面向对象软件测试模型(续),面向对象的测试模型,面向对象软件测试模型(续

34、),OOA Test 和OOD Test 是对分析结果和设计结果的测试,主要是对分析设计产生的文档进行测试,是软件开发前期的关键性测试。OOP Test 主要针对编程风格和程序代码实现进行测试,主要的测试内容在面向对象单元测试和面向对象集成测试中体现。面向对象单元测试针对程序内部具体单一功能的模块进行测试,比如在C+程序中对类成员函数的测试。面向对象集成测试主要对系统内部的相互服务进行测试,如成员函数间的相互作用、类间的消息传递等。面向对象系统测试是基于面向对象集成测试的最后阶段的测试,主要以用户需求为测试标准。,面向对象分析的测试(OOA Test),OOA直接映射问题空间,全面地将问题空间

35、中实现功能的实例抽象为对象(不同于C+中的对象概念),用对象的结构反映问题空间的复杂实例和复杂关系,用属性和服务表示实例的特性和行为。OOA的测试重点在其完整性和冗余性。对OOA阶段的测试划分为五个方面:对认定的对象的测试;对认定的结构的测试;对认定的主题的测试;对定义的属性和实例关联的测试;对定义的服务和消息关联的测试。OOA中认定的对象:是指对问题空间中的结构、其他系统、设备、被记忆的事件、系统涉及的人员等实际实例的抽象。,面向对象设计的测试(OOD Test),OOD是OOA的进一步细化和扩充,重点在于说明项目的实施方案,来确定类和类的结构。对OOD的测试,应针对功能的实现和重用以及对O

36、OA结果的拓展进行,从以下三方面考虑:(1)对认定的类的测试是否涵盖了OOA中所有认定的对象;是否能体现OOA中定义的属性;是否能实现OOA中定义的服务;是否对应着一个含义明确的数据抽象;是否尽可能少的依赖其他类;类中的方法是否单用途。(2)对构造的类层次结构的测试类层次结构是否涵盖了所有定义的类;是否能体现OOA中定义的实例关联;是否能实现OOA中定义的消息关联;子类是否具有父类没有的新特性;子类间的共同特性是否完全在父类中得以体现。(3)对类库支持的测试,面向对象编程的测试(OOP Test),面向对象程序是把功能的实现分布在类中。能正确实现功能的类,通过消息传递来协同实现设计要求的功能。

37、这种程序架构能将出现的错误精确的确定在某一具体的类。对OOP的测试重点集中在类功能的实现和相应的面向对象程序架构,主要体现为以下两个方面:(1)数据成员是否满足数据封装的要求基本原则是数据成员是否被外界(数据成员所属的类或子类以外的调用)直接调用。(2)类是否实现了要求的功能测试类的功能,不能仅满足于代码能无错运行或被测试的类能提供的功能正确,应以所做的OOD结果为依据,检测类提供的功能是否满足了设计的要求,是否有缺陷。,面向对象的单元测试,在传统软件中,确定单元的指导方针是:能够自身编译的最小程序块;单一过程/函数(独立);由一个人完成的小规模工作。面向对象软件测试与传统方法的区别:指导方针

38、中没有明确说明是把类还是方法作为单元。下面对分别以方法和类作为单元的测试进行简单的介绍和比较。,面向对象的单元测试(续),以方法为单元 可以将面向对象单元测试归结为传统的单元测试。可以使用所有传统功能性测试和结构性测试技术。前期工作相对容易,但后续测试工作重。以类为单元面向对象测试的层次,取决于单元的构成,一般采用三层或四层方式。如果把单个操作或方法看作单元,则有四层测试,即操作/方法、类、集成和系统测试。面向对象测试的主要问题是集成测试,可以看作是第三层,即在通过测试的类之间的交互测试。,面向对象的单元测试,传统的单元测试是针对程序的函数、过程或完成某一特定功能的程序块。从方法为单元的角度来

39、看,面向对象单元测试实际测试类成员函数。单独的看待类的成员函数,与面向过程程序中的函数或过程没有本质的区别,传统的测试方法在面向对象单元测试中都可使用,如等价类划分法、因果图法、边值分析法、逻辑覆盖法、路径分析法等等。面向对象编程的特性使得对成员函数的测试又不完全等同于传统的函数或过程测试。尤其是继承特性和多态特性,使子类继承或重载的父类成员函数出现了传统测试中未遇见的问题。这里要考虑如下两个问题:(1)继承的成员函数是否都不需要测试?(2)对父类的测试是否能照搬到子类?,面向对象的单元测试(续),继承的成员函数是否都不需要测试?对父类中已经测试过的成员函数,以下两种情况需要在子类中重新测试:

40、a)继承的成员函数在子类中做了改动;b)成员函数调用了改动过的成员函数的部分。例:假设存在父类Base有Inherited()和Redefined()这两个成员函数,继承父类Base的子类Derived只对Redefined()做了改动。那么,Derived:Redefined()就需要重新测试;对于Derived:Inherited(),若它包含了调用Redefined()的 语句(比如:x=x/Redefined()),就需要重新测试,否则就不需要。,面向对象的单元测试(续),对父类的测试是否能照搬到子类?引用前面的假设,成员函数Base:Redefined()和Derived:Redef

41、ined()已经是不同的。那么,按理应该要对Derived:Redefined()重新测试分析,设计测试用例。但是由于面向对象的继承使得两个函数相似,故只需要在对Base:Redefined()的测试要求和测试用例上添加对Derived:Redefined()新的测试要求和增补相应测试用例。例 Base:Redefined()含有如下语句:If(value0)message(“less”);else if(value=0)message(“equal”);else message(“more”);,面向对象的单元测试(续),例(续)在Derived:Redefined()中定义为:If(val

42、ue0)message(“less”);else if(value=0)message(“It is equal”);else message(“more”);if(value=88)message(“luck”);在原有对父类Base的测试上,对Derived:Redefined()的测试只需作如下改动:将value=0的测试结果期望改动;增加value=88的测试。,面向对象的集成测试,传统的自顶向下和自底向上的集成策略对于面向对象的测试集成是没有意义的,类之间的相互依赖使其根本无法在编译不完全的程序上对类进行测试。因此,面向对象集成测试通常需要在整个程序编译完成后进行。此外,面向对象程序

43、具有动态特性,程序的控制流往往无法确定,所以也只能对整个编译后的程序做基于黑盒的集成测试。面向对象的集成测试通常需要进行两级集成:一是将成员函数集成到完整类中;二是将类与其它类集成。面向对象的集成测试能够检测出相对独立的单元测试无法检测出的那些类相互作用时才会产生的错误。单元测试可以保证成员函数行为的正确性,集成测试则只关注于系统的结构和内部的相互作用。,面向对象的集成测试(续),面向对象集成测试可以分成两步进行:先进行静态测试,再进行动态测试。静态测试主要针对程序结构进行,检测程序结构是否符合设计要求。现在常用的一些测试软件都能提供一种称为“可逆性工程”的功能,即通过源程序得到类关系图和函数

44、功能调用关系图。将“可逆性工程”得到的结果与OOD的结果相比较,以检测OOP是否达到了设计要求。动态测试则测试与每个动态语境有关的消息。设计测试用例时,通常需要上述的功能调用关系图、类关系图或实体关系图为参考,确定不需要被重复测试的部分,从而优化测试用例,使得进行的测试能够达到一定覆盖标准。,面向对象的系统测试,系统测试应该尽量搭建与用户实际使用环境相同的测试平台,应该保证被测系统的完整性,对临时没有的系统设备部件,也应有相应的模拟手段。面向对象的系统测试时,应该参考OOA分析的结果,对应描述的对象、属性和各种服务,检测软件是否能够完全“再现”问题空间。系统测试不仅是检测软件的整体行为表现,从

45、另一方面看,也是对软件开发设计的再确认。这里说的系统测试是对测试步骤的抽象描述。具体测试的内容包括:功能测试、强度测试、性能测试、安全测试、恢复测试、可用性测试、安装/卸载测试等。,5.4.4 类的功能性测试和结构性测试,对面向对象软件的类测试相当于传统软件中的单元测试。类的测试用例可以先根据其中的方法设计,然后扩展到方法之间的调用关系。类测试一般也采用传统的两种测试方式:功能性测试和结构性测试,即黑盒测试和白盒测试。功能性测试以类的规格说明为基础,主要检查类是否符合其规格说明的要求。功能性测试包括两个层次:类的规格说明和方法的规格说明。结构性测试则是从程序出发,对类中方法进行测试,需要考虑其

46、中的代码是否正确。测试分为两层:第一层考虑类中各独立方法的代码,即方法要做单独测试;第二层考虑方法之间的相互作用,即方法需要进行综合测试。,5.4.5 状态转移图的面向对象软件测试,面向对象设计方法通常采用状态转移图建立对象的动态行为模型。状态转移图用于刻画对象响应各种事件时状态发生转移的情况,图中结点表示对象的某个可能状态,结点之间的有向边通常用“事件/动作”标出。基于状态的测试是通过检查对象的状态在执行某个方法后是否会转移到预期状态的一种测试技术。使用该技术能够检验类中的方法是否能正确地交互。因为对象的状态是通过对象数据成员的值反映出来,所以检查对象的状态实际上就是跟踪监视对象数据成员的值

47、的变化。如果某个方法执行后对象的状态未能按预期的方式改变,则说明该方法含有错误。,状态转移图的面向对象软件测试(续),基于状态测试的主要步骤:(1)依据设计文档,或者通过分析对象数据成员的取值情况空间,得到被测试类的状态转移图。(2)给被测试的类加入用于设置和检查对象状态的新方法,导出对象的逻辑状态。(3)对于状态转移图中每个状态,确定该状态是哪些方法的合法起始状态,即在该状态时对象允许执行哪些操作。(4)在每个状态,从类中方法的调用关系图最下层开始,逐一测试类中的方法;测试每个方法时,根据对象当前状态确定出对方法的执行路径有特殊影响的参数值,将各种可能组合作为参数进行测试。,5.4.6 类测

48、试驱动程序设计,编写类测试驱动程序的方法有很多种:在main方法中写入需要运行的测试用例,即实现main方法,然后编译、执行该类。该方法的优点是所见即所得,能够尽快的得到测试结果,但不利于后期测试代码的维护和测试代码的复用,并且在交付程序时,必须逐个剔除测试代码。在类中实现一个静态测试方法,通过调用该测试方法来收集每个测试用例的执行结果。该方法的优点是测试代码调用方便,被测试类无需实例化就可以进行测试,但同样具有第一种方法的缺点。实现独立的测试类,它的职责是执行并收集每个测试用例的结果。在main方法中将这个类实例化,并向它发送一个消息以运行所有的测试用例。该方法的优点是测试代码可复用,测试用

49、例独立于被测试类,有利于测试代码的维护,可一次执行多个测试用例,能够为回归测试带来很多的方便,但必须创建新类,并且需要密切关注被测试类的变化。,5.4.7 类测试的延伸,本节将简要介绍类测试构造思想以及如何对接口类、抽象类等进行测试的方法。继承层次结构中类的测试接口类测试抽象类测试重载和覆盖测试异常测试,继承层次结构中类的测试,继承是实现接口和代码复用的有效机制。根据继承机制的特点,父类中被测试用例所测试的代码被子类继承,只要父类代码没有被子类“覆盖”,那么就不用重新创建这些测试用例。图5-1显示了各类之间的继承关系,Class_A类有两个实例方法operation1()和operation2

50、(),Class_B类继承了Class_A类并且实现了新的实例方法operation3(),Class_C类继承了Class_B类,覆盖了Class_B类的实例方法operation3()和实例方法operation2().,图5-1 类之间的继承关系,继承层次结构中类的测试,根据图5-1中这三个类之间的区别,可以确定继承的测试用例中是否需要产生新的子类测试用例,哪些测试用例适用于测试子类,哪些测试用例在测试子类中不必执行,如下表所示:,继承层次结构中类的测试,由此,可以得出继承层次结构中类测试的测试用例可以采用如下增补原则:1)如果子类新增了一个或者多个新的操作,就需要增加相应的测试用例。2

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号