软件测试技术完整教程(二).ppt_第1页
软件测试技术完整教程(二).ppt_第2页
软件测试技术完整教程(二).ppt_第3页
软件测试技术完整教程(二).ppt_第4页
软件测试技术完整教程(二).ppt_第5页
已阅读5页,还剩200页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章 系统测试,本章要点 系统测试的定义; 系统测试的组织与分工; 系统测试的类型; 系统测试的测试用例设计方法; 系统测试的案例分析。,本章目标 进一步理解系统测试和集成测试的区别; 掌握系统测试的概念; 熟悉主要的系统测试类型及其特点; 了解系统测试的过程; 重点理解如何把黑盒测试技术运用到系统测试中。,5.1系统测试概述 系统测试的根本任务就是要证明被测系统的功能和结构的稳定性;还要有一些非功能测试:性能测试、压力测试、可靠性测试等等。 最终目的是为了确保软件产品能够被用户或操作者接受。测试的主要目标不再是找出缺陷,而是证明其性能。 系统测试属于黑盒测试范畴,不再对软件的源代码进行分析和测试。,5.1.1什么是系统测试 系统测试就是将已经集成好的软件系统,作为整个计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其它系统元素结合在一起,在实际运行(使用)环境下,对计算机系统进行一系列的组装测试和确认测试。 系统测试的目的在于通过与系统的需求定义比较,检查软件是否存在与系统定义不符合或与之矛盾的地方,以验证软件系统的功能和性能等满足其规约所指定的要求。,5.1.2系统测试的组织和分工 测试组组长:组织测试; 测试分析员:负责设计和实现测试脚本和测试用例; 测试者:负责执行测试脚本中记录的测试用例。 同时可以邀请客户代表参与系统测试,可以与客户建立一个良好的平台,并且得到反馈信息。 过程:搭建好系统测试的软、硬件平台制定软件测试计划(与开发人员多多沟通)系统测试提交系统测试的大量输出的拷贝文档(包括测试结果记录表格、系统测试日志和全面的系统测试总结报告)。,5.2如何进行系统测试 系统测试过程要经历以下几个阶段: 制定系统测试计划、设计系统测试、实施系统测试、执行系统测试和评估系统测试。(如图5-1所示),图5-1系统测试过程,与之对应的是如下的几个阶段: 一、计划阶段:制定测试计划 二、设计阶段:对系统进行详细的测试分析,然后设计一些典型的,满足测试需求的测试用例;同时给出系统测试的大致过程。 三、实施阶段:使用当前的软件版本进行测试脚本的录制工作,确定软件的基线。 四、执行阶段:根据系统测试计划和事先设计好的系统测试用例,以及一定测试规程进行测试脚本的回放。 五、评估阶段:进行评估,以确定系统测试是否通过。,5.2.1系统测试分析 测试人员在做系统测试分析时,不妨分别从用户 层、应用层、功能层、子系统层、协议层等几个层次 入手: 1)用户层 用户层的测试核心应该围绕用户界面的规范性、 友好性、可操作性,系统对用户支持的情况,以及数 据的安全性等方面展开; 还应该注意可维护性测试和安全性测试。,2)应用层 主要是针对产品工程应用或行业应用的测试。 从系统应用的角度:对系统的兼容性、可靠性、 性能等进行的测试。 对整个系统的应用层测试:包含并发性能测试、负 载测试、压力测试、强度测试、破坏性测试。 3)功能层 测试是否已经实现需求规格说明中定义的功能, 以及系统功能间是否存在类似共享资源访问冲突。,4)子系统层 针对产品内部结构性能的测试。关注子系统 内部的性能,子系统间接口的瓶颈。 5)协议/指标层 针对系统所支持的协议,进行协议一致性测试 和协议互通测试。,5.2.2系统测试环境 软件测试环境构建的是否合理、稳定和具有代表性,将直接影响到软件测试结果的真实性、可靠性和正确性, 现阶段,应该构件效率高、灵活性好、可复用性强的可“复用”的测试环境。 测试前要保证测试软件的可靠性;保证系统软件、数据库、应用软件的可靠性和安全性;并且尽量减少镜像文件的大小。,5.2.3系统测试类型 介绍17类系统测试类型 。 一、功能测试(Functional Test) 功能测试属于黑盒测试技术范畴,是系统测试中要进行的最基本的测试,它不用考虑软件内部的具体实现过程。 主要是根据产品的需求规格说明书和测试需求列表,验证产品是否符合产品的需求规格。 需求规格说明是功能测试的基本输入。因此先对需求规格进行分析,明确功能测试的重点。可按照如下步骤进行:, 为所有的功能需求(其中包括隐含的功能需求)加以标识; 为所有可能出现的功能异常进行分类分析并加以标识; 对前面表示的功能需求确定优先级。 对每个功能进行测试分析,分析其是否可测、采用何种测试方法、测试的入口条件、可能的输入、预期输出等等。 是否需要开发脚本或借助工具录制脚本。 确定要对哪些测试使用自动化测试,对哪些测试使用手工测试。,功能测试用例是功能测试工作的核心,常见的设计方法有如下几种: 规范导出法 等价类划分法 边界值分析法 因果图 判定表 正交实验设计 基于风险的测试 错误猜测法 经常进行的功能测试项目如下: 1.页面链接检查 2.相关性检查 3.检查按钮的功能是否正确 4.字符串长度检查,5.字符类型检查 6.标点符号检查 7.中文字符处理 8.检查带出信息的完整性 9.信息重复 10.检查删除功能 11.检查添加和修改是否一致 12.检查修改重名 13.重复提交表单 14.检查多次使用back键的情况,15. search检查 16.输入信息位置 17.上传下载文件检查 18.必填项检查 19.快捷键检查 20.回车键检查 二、协议一致性测试(Protocol Conformance Testing) 分布式系统中,很多计算功能的完成需要由分布式系统内的多台计算机相互进行通信、交换信息、协调合作来完成的,必须遵循一定的规则(协议)。 所以要进行协议测试。,通常包括如下几种类型的协议测试: 1、协议一致性测试:检查所实现的系统是否与标准协议符合; 2、协议性能测试:检查协议实体的各种性能指标(如:数据传输率、连接时间、执行速度); 3、协议互操作性测试:验证相同协议在不同实现的环境中的相容性; 4、协议健壮性测试:用来考验系统在外界因素下抗干扰的能力,例如通信中止、人为破坏等等。 三、性能测试(Performance Test),性能测试在软件的质量保证中起着重要的作用。可从三个方面进行性能测试:应用在客户端性能的测试、应用在网络上性能的测试和应用在服务器端性能的测试。 1、应用在客户端性能的测试 目的是考察客户端应用的性能,测试的入口是客户端。 它主要包括并发性能测试、疲劳强度测试、大数据量测试和速度测试等,其中并发性能测试是重点。 并发性能测试的过程是一个负载测试和压力测试的过程,即逐渐增加负载,直到系统的瓶颈或者不能接收的性能点,通过综合分析交易执行指标和资源监控指标来确定系统并发性能的过程。 并发性能测试的目的主要体现在三个方面:以真实的业务为依据,选择有代表性的、关键的业务操作设计测试案例,以评价系统的当前性能;,当扩展应用程序的功能或者新的应用程序将要被部署时,负载测试会帮助确定系统是否还能够处理期望的用户负载,以预测系统的未来性能;通过模拟成百上千个用户,重复执行和运行测试,可以确认性能瓶颈并优化和调整应用,目的在于寻找到瓶颈问题。 例如:在每月20日左右是电话交费的高峰期,几千个收费网点同时启动。收费过程一般分为两步,首先要根据用户提出的电话号码来查询出其当月产生费用,然后收取现金并将此用户修改为已交费状态。一个用户看起来简单的两个步骤,但当成百上千的终端,同时执行这样的操作时,情况就大不一样了,如此众多的交易同时发生,对应用程序本身、操作系统、中心数据库服务器、中间件服务器、网络设备的承受力都是一个严峻的考验。 这种问题在软件测试阶段就应该得到解决。,并发性能测试前的准备工作 测试环境; 测试工具:并发性能测试工具有QALoad、 LoadRunner、Benchmark Factory 和Webstress等; 测试数据; 并发性能测试的种类与指标 并发性能测试的种类取决于并发性能测试工具监控的对象,以QALoad自动化负载测试工具为例。 软件针对各种测试目标提供了DB2、DCOM、ODBC、ORACLE、NETLoad、Corba、QARun、SAP、SQLServer、Sybase、Telnet、 TUXEDO、UNIFACE、WinSock、WWW、 Java Script等不同的,监控对象,支持Windows和UNIX测试环境。 主要的测试指标包括交易处理性能指标和UNIX资源监控。 疲劳强度与大数据量测试 疲劳测试是采用系统稳定运行情况下能够支持的最大并发用户数,持续执行一段时间业务,通过综合分析交易执行指标和资源监控指标来确定系统处理最大工作量强度性能的过程。 大数据量测试可以分为两种类型:针对某些系统存储、传输、统计、查询等业务进行大数据量的独立数据量测试;与压力性能测试、负载性能测试、疲劳性能测试相结合的综合数据量测试方案。大数据量测试的关键是测试数据的准备,可以依靠工具准备测试数据。,2、应用在网络上性能的测试 该测试重点是利用成熟先进的自动化技术进行网络应用性能监控、网络应用性能分析和网络预测。下面我们分别从三个方面来阐述。 网络应用性能分析 目的就是准确展示网络带宽、延迟、负载和TCP端口的变化是如何影响用户的响应时间的。 网络应用性能监控 主要用来分析关键应用程序的性能,定位问题的根源是在客户端、服务器、应用程序还是网络。 网络预测 从网络管理软件获取网络拓扑结构、从现有的流量监控软件获取流量信息,这样可以得到现有网络的基本结构,并进行流量分析和冲突检测。,3、应用在服务器上性能的测试 采用工具监控资源使用情况。 实施测试的目的是实现服务器设备、服务器操作系统、数据库系统、应用在服务器上性能的全面监控,测试原理如图5-2。,图5-2 应用服务器上的性能测试原理图,对于安装UNIX操作系统的服务器来说,有如下资源监控指标: 平均负载: 系统正常状态下,最后60秒同步进程的平均个数 冲突率: 在以太网上监测到的每秒冲突数 进程/线程交换率: 进程和线程之间每秒交换次数 CPU利用率: CPU占用率() 磁盘交换率: 磁盘交换速率 接收包错误率: 接收以太网数据包时每秒错误数 包输入率: 每秒输入的以太网数据包数目 中断速率: CPU每秒处理的中断数,输出包错误率: 发送以太网数据包时每秒错误数 包输入率: 每秒输出的以太网数据包数目 读入内存页速率: 物理内存中每秒读入内存页的数目 写出内存页速率: 每秒从物理内存中写到页文件中的内存页数目或者从物理内存中删掉的内存页数目 内存页交换速率: 每秒写入内存页和从物理内存中读出页的个数 进程入交换率: 交换区输入的进程数目 进程出交换率: 交换区输出的进程数目 系统CPU利用率: 系统的CPU占用率() 用户CPU利用率: 用户模式下的CPU占用率() 磁盘阻塞: 磁盘每秒阻塞的字节数,四、压力测试 压力测试又称强度测试,是在各种资源超负荷情况下观察系统的运行情况。在压力测试过程中,测试人员主要关注的是非正常资源占用的情况下系统的处理时间。 注意:区分压力测试和容量测试 五、容量测试 容量测试是面向数据的,在系统正常运行的范围内测试并确定系统能够处理的数据容量。也就是观察系统承受超额的数据容量的能力。 六、安全性测试 要验证系统内的保护机制能否抵御入侵者的攻击。,所谓的系统安全性就是让系统非法入侵者花费更多的时间、付出更大的代价来交换其所获得的系统信息,即让非法者获得的一切信息内容贬值。 评价标准:有效性;生存性;精确性;出错反应时间;吞吐量 七、恢复性测试 恢复性测试的目标就是验证系统从软件或者硬件失败中恢复的能力。在测试过程中会采取各种人工干预方式使软件出错,而不能正常工作,进而检验系统的恢复能力。 在进行恢复性测试时,同样首先要进行恢复性测试分析,经常要考虑的主要问题有如下几个:,1)恢复期间的安全性过程; 2)恢复处理日志方面的能力; 3)当出现供电问题时的恢复能力; 4)恢复操作后系统性能是否下降。 八、备份测试 备份测试为了验证系统在软件或者硬件失败的事件中备份其数据的能力,它属于恢复性测试的一个部分。 九、GUI测试 GUI(Graphic User Interface)即图形化用户接口, GUI测试只是软件产品界面测试的一部分,GUI测试分为两个部分,一方面要能使得界面实现与最初设计的情况相符合;另一方面是要确认界面能够正确处理事件。,进行GUI测试的时候我们需要面对的主要问题是: 测试中可能的状态集繁多。 不易模拟的事件驱动。 不容易区分被测系统的界面与功能。 容易受主观影响。 无恰当的专业测试工具。 解决方法:在设计阶段将界面与功能隔离。这样就要把一个GUI系统分为3个层次:界面层、界面与功能的接口层、功能层。GUI测试则忽略功能层,主要针对界面层和界面与功能接口层上。 十、 健壮性测试 健壮性测试又被称为容错性测试。主要是测试系统在出现故障时,是否能够自动恢复或者忽略故障继续运行。,十一、 兼容性测试 目的就是检验被测应用对其他应用或者系统的兼容性,比如在对一个共享资源(数据、数据文件或者内存)进行操作时,检测两个或多个系统需求能否正常工作以及相互交互使用。 在做兼容性测试时,要主要关注如下几个问题: 当前系统可能运行在哪些不同的操作系统环境下? 当前系统可能与哪些不同类型的数据库进行数据交换? 当前系统可能运行在哪些不同的硬件配置的环境上? 当前系统可能需要与哪些软件系统协同工作?这些软件系统可能的版本有哪些? 是否需要综合测试?,十二、可用性测试 可用性测试是面向用户的系统测试。 进行可用性测试时,测试人员应该关注如下几个 方面: 系统中是否存在繁琐的功能以及指令; 安装过程是否复杂; 错误信息提示内容是否详细; GUI接口是否标准; 登录是否方便; 需要用户记住内容的多少; 帮助文本是否详细;,页面风格是否一致; 是否会造成理解上的歧义。 执行的操作是否与预期的功能相符,如点击保存按钮时记录是否存入数据库。 十三、可安装性测试 可安装性测试的目的就是要验证成功安装系统的能力。安装系统处在一个开发项目的结束也是被测系统的开始。 十四、文档测试 文档测试是对系统提交给用户的文档进行验证,并不是一般性的审查活动。通过文档测试保证用户文档的正确性并使得操作手册能够准确无误。,文档测试可以辅助系统的可用性测试、可靠性测试,亦可提高系统的可维护性和可安装性。 十五、在线帮助测试 在线帮助测试给用户提供一种实时的咨询服务。 十六、数据转换测试 主要是为了验证已存在的数据转换并载入一个新的数据库是否有效。 十七、验收测试 验收测试是将程序与其最初的需求及最终用户当前的需要进行比较的过程。,5.2.4系统测试用例设计 系统测试用例设计基本上都是用黑盒测试方法,也就是说测试人员在作系统测试时无需知道系统是由结构化程序设计语言还是面向对象程序设计语言来实现的。 生成系统测试用例很简单,关键问题是:如何确定和选择测试用例才能保证对系统进行充分的测试? 一、基于有限状态机的系统级线索测试用例设计 几个基本概念:原子系统功能,源ASF和汇ASF,系统线索,有限状态机。 基于线索的系统测试用例设计步骤如下:,寻找线索:如果系统复杂,那么首先画出系统的顶层状态机,在这一层状态对应的阶段中,表示转移的事件可以用逻辑事件来表示;然后再对顶层状态机的宏状态进行细化。 制定线索测试的策略: 一般采用自底向上的组织线索策略。首先,确定能够遍历底层状态机的线索路径;然后,再依次上升到上一级有限状态机,遍历线索路径。 测试用例的确定和测试的度量:在遍历线索路径的过程中,可以参照节点与边覆盖指标来选取线索并度量所选取的测试用例是否能够对系统进行充分的测试。节点覆盖指标要求所选择的线索必须覆盖有限状态机的所有状态;边覆盖要求要求所选择的线索必须覆盖所有的转移(状态转换)。,二、基于UML的系统级线索测试用例设计 基于这种方法进行系统测试的前提条件是假设系统已经通过统一建模语言定义和细化。 1、明确软件系统的功能,至少要使用显示功能、隐藏功能和装饰功能对其进行标识; 2、勾画出系统界面草图,证明系统功能可以得到用户界面的支持; 3、通过系统功能的描述开发出高层用例,包括测试用例的名称、参与者、功能类型和功能描述等四项信息; 4、在高层用例中增加“参与者行动”和“系统响应”两项信息;,5、扩展基本用例:增加“前提”和“结果”信息,以及有关替代事件序列信息,以及与过程早期表示的系统功能的交叉引用信息等。另外一种扩展就是添加新的测试用例; 6、导出真实用例:如用“在password文本框中输入数字123”这样的短语来代替“输入正确密码”; 7、选择和确定测试用例。 在选择和确定测试用例时,要考虑是否达到了相应的覆盖标准。 第一个层次:列出扩展基本用例和系统功能的关联矩阵;然后,找出可以覆盖所有功能的一组扩展基本用例;最后,通过使用这些扩展基本用例导出真实用例以及系统测试用例。,第二个层次:通过所有真实用例开发测试用例,这是系统测试所应该达到的最低限度的测试覆盖要求。 第三个层次:通过有限状态机导出测试用例。 第四个层次:通过基于状态的事件表导出测试用例。 5.2.5系统测试执行 系统测试的执行常常需要使用相应的测试工具,对于那些涉及到数据量很多的测试尤其如此,使用手工测试不但浪费时间,而且有时候也无法得到精确的测试结果。,为了能够把系统测试工作做好,可以参考下面几条原则: 1、判断是否已经给出测试手段,若没有就要判断工作量、选择自动化工具。 2、进行测试,保存好测试脚本、以及测试结果,对测试结果进行精确的分析,判断软件缺陷所在。 3、若软件不是第一版本,要重新测试先前系统测试周期中发现的缺陷。 4、在系统测试执行期间,必须把测试的结果添加到缺陷跟踪数据库中。 5、在系统测试的过程中,测试人员要注意一定要使,用具有代表性并且接近真实的数据,因为这样可以保证测试的可靠性和真实性。 另一个要考虑因素是:决定由谁来进行测试?一般不能由程序员以及软件开发机构单独进行测试。 5.2.6系统测试案例研究 以两票系统的功能测试作为一个案例,使用基于有限状态机的系统级线索测试用例设计的方法,介绍进行系统测试的具体过程。 一、 测试计划 一份测试计划至少需要包括测试对象、测试目标、测试策略、测试终止准则、测试环境与测试工具、测试资源配置(人员与时间)几个方面的内容。,1)测试对象:两票管理系统的功能; 2)测试目标:验证两票编写和票据档案查询功能; 3)需求和设计阶段产生的相关文档及说明是功能测试需求的首要来源,对我们的这个系统而言,在需求文档中对开具操作票功能有如下规定: 1、 可以普通用户和系统管理员的身份开票 2、 可以在多个部门的多个系统图上开票。 3、 可以在两种系统图上同时开操作票。 在设计文档中,对于开票功能有更详细的定义: 1、 密码输入错误时应给出错误提示信息。 2、 操作票成功保存时应弹出保存成功对话框。,4)测试策略:描述对整个测试采取的方法,本次测试的测试策略规定,测试最少为2轮,每轮测试应该执行所有的测试用例至少一次。 5)测试终止准则:整个测试的终止准则是“所有待验证指标都达到”。 6)测试环境与测试工具:确定本测试需要使用的测试工具和定义需要使用的测试环境。在本系统的测试中,要求服务器端必须配置JVM、web服务器、JDBC驱动程序、SQL Server数据库服务器,客户端安装JVM和IE5.0以上版本浏览器。 7)测试资源配置:描述执行本测试需要的人员和时间资源。 二、寻找线索并设计测试用例(详见教材两票系统) 测试用例至少应该详细定义了用例执行的先决条件、测试输入和预期输出,以很直观的方式给,出了测试用例的各个要素。,图5-4 “身份验证”有限状态机,为了便于表示线索,我们首先列出表示状态转移的端口事件,如表5-1所示:,表5-1 身份验证有限状态机中的事件,三、测试数据 四、 测试环境与测试工具 1测试环境 由于该系统是基于B/S架构的系统,因此功能测试需要在一个网络环境中进行,可以先选择在一个单独的局域网中进行,然后使用了和生产环境类似的网络环境中进行。 2. 测试工具 本例中我们选取IBM Rational Functional Tester工具(在Java环境中工作的版本)来执行测试。 五、测试实施 六. 测试结果分析与测试报告,需要丰富的经验;需要明确获取的每个数据的意义,然后根据数据测试目标,对数据进行详尽分析,分析的目的是用数据说明测试目标。 在测试报告中,主要包括以下几部分的内容: 1、 测试环境描述 2、 测试准备工作描述 3、 测试范围及内容 4、 测试结论 5、 建议与计划 6、 附件:将测试用例的执行情况和每轮测试执 行的详细记录。 5.3系统测试经验总结,适当的组织和实施能大大的提高测试效率;在做系统测试的过程中不断的积累测试经验;下面几点系统测试的经验: 1、要多次和用户进行沟通 2、要根据系统的特点和风险分析等方法来确定测试实施的重点(测试的优先级)。 3、不能盲目的使用自动化测试工具,一旦使用了自动化测试就要充分利用和掌握使用工具的技巧。 4、在做系统测试计划时,时间上要留出冗余,防止意外情况发生影响测试的质量。 5、保证测试环境安全,获得更为真实的测试数据。,本章小结 系统测试是在一个完整的环境下对整个系统进行的测试,可以说它是软件提交给用户之前的最后一道质量屏障; 系统测试类型有很多,其中最主要的两种测试就是功能测试和性能测试。 大多数类型的系统测试用例设计都使用黑盒测试技术; 对于一些无法使用手工实现的系统测试要借助于工具来实施,但不能盲目引入测试工具。,习 题 1、系统测试的主要类型有哪些? 2、系统测试使用的主要技术是黑盒测试技术还是白盒测试技术? 3、使用手工测试能够进行系统的性能测试分析吗? 4、在做系统测试之前还需要和用户进行沟通吗? 5、你认为系统测试和集成测试有哪些区别? 6、使用黑盒测试技术,针对你所熟悉的软件系统设计一种类型的系统测试案例。,第六章 面向对象软件的测试,本章要点 面向对象软件的测试与传统软件的区别; 类测试价值的评估方法; 类测试用例设计方法; 特殊类的测试方法; 划分面向对象软件测试的方法; 开源工具Junit的使用方法。,本章目标 了解面向对象的测试与传统软件测试的异同; 掌握类测试的基础知识; 重点理解针对抽象类以及接口类等特殊类的测试技巧,设计类测试用例和测试驱动程序的几种方法; 初步了解Junit,并掌握安装和卸载此工具的方法,以及如何使用它进行简单的测试。,6.1面向对象的测试与传统测试的比较 传统的测试计算机软件的策略是从“小型测试”开始,逐步走向“大型测试”,且单元测试集中在最小的可编译程序单位子程序。 面向对象程序的结构不再是传统的功能模块结构,而是作为一个整体,并且对每个开发阶段都有不同以往的要求和结果,已经不可能用功能细化的观点来检测面向对象分析和设计的结果。 面向对象的软件测试分为:面向对象分析的测试,面向对象设计的测试,面向对象编程的测试,,面向对象单元测试,面向对象集成测试,面向对象系统测试。 1、传统的面向过程分析与面向对象分析(OOA) 2、结构化的设计方法与面向对象设计(OOD) 3、典型的面向对象程序具有继承、封装和多态的新特性。 4、传统的单元测试的对象是软件设计的最小单位模块。 5、传统的集成测试,主要有两种通过集成完成的功能模块进行测试的方式:自顶向下集成 自底向上集成。,6、为了保证软件的功能完整性,除了单元测试和集成测试,还必须经过规范的系统测试。 6.1.1信息隐蔽对测试的影响 类的重要作用之一是信息隐蔽。它对类中所封装的信息的存取进行控制,从而避免类中有关实现细节的信息被错误地使用。该隐蔽机制给测试带来了困难。 6.1.2封装和继承对测试的影响 若一个类得到了充分的测试,当其被子类继承后,继承的方法在子类的环境中的行为特征需要重新测试。,6.1.3多态性对测试的影响 传统软件测试中经常使用静态分析技术对代码进行分析;面向对象软件中,由于动态绑定和多态性的存在所带来的不确定性,给测试覆盖率的满足增大了难度。 6.2 类测试基础 1、类测试概念:验证类的实现是否和该类的说明完全一致。 2、类测试的方法:通过代码检查或执行测试用例的方法来有效地进行类测试。(后者优于前者)。,3、类测试人员 类测试通常由开发人员来进行;(会带来好处和不足之处)。 4、类测试时间 类的测试伴随着开发过程中的各个阶段,当类的说明或实现发生变化时应该执行回归测试。 5、类测试过程 为类创建实例创造适当的环境运行测试用例(向一个实例发送一个或多个消息)通过参数来检查测试运行的结果清除执行测试用例所需的测试环境。,6.2.1类在UML中的描述 UML(Unified Modeling Language)语言是一种支持对象技术的建模语言,是在计算机系统中表示真实世界的语言,描述真实世界中的对象和它们之间的关系,支持应用的开发。 在UML中,用来表示类的符号是矩形,并划分为三个区域,分别是: 名称区域:显示类的名称 属性区域:显示在类中定义的变量。 操作区域:显示在类中定义的方法。 如图6-1所示:,图6-1 类的UML表示法,类之间的关系分为六类,分别是关联、泛化、实现、依赖、聚合和组合。每种关系分别使用不同的符号来表示(如:表6-1所示),并分别用私有的、保护的和公有的三个关键字来修饰类(如:表6-2所示)。,表6-1 UML类图符号描述,表6-2 UML类图作用域描述,6.2.2类测试的价值 选择将每个类作为一个单元进行单独的测试,还是将其同其他类绑定进行集成测试,需要使用如下3个要素来进行测试价值的评估:,1、类本身的复杂程度 2、类在整个系统中的层次 3、开发该类测试驱动程序需要投入的成本 4、类本身的风险程度 6.2.3类测试用例设计 一般基于如下3个标准设计测试系列,即基于状态的覆盖率、基于限制的覆盖率和基于代码的覆盖率。 设计测试用例的方法有多种: (例子详见教材) 1、根据前置和后置条件确定测试用例,2、根据状态转换确定测试用例 3、根据访问控制修饰符(限定类、属性或方法被程序里的其他部分访问和调用的修饰符)来确定测试用例。 6.2.4类测试驱动程序设计 从开发的角度:测试驱动的基本思想是在对设计 之前先考虑好测试代码; 从测试的角度:为了执行测试,运行测试用例, 找出软件中隐藏的BUG。 因此,测试驱动程序的构建应该简单、透明、易维护,能够提供尽可能多的服务,同时兼顾自增量更新,更理想的情况就是能够复用已存在的测试驱动程序的代码。,编写类测试驱动程序的方法有很多种 ,以Java语言为例来说明测试驱动程序设计的结构。 (主要以两票系统为例讲解,详见教材) 1、在main方法中写入需要运行的测试用例,即实现main方法,然后编译、执行该类。 2、在类中实现一个静态测试方法,通过调用该测试方法来收集每个测试用例的执行结果。 3、实现独立的测试类,它的职责是执行并收集每个测试用例的结果。,6.3类测试的延伸 本节将简要介绍类测试构造思想以及如何对接口类、抽象类等进行测试的方法。 一、继承层次结构中类的测试 继承是实现接口和代码复用的有效机制。根据继承机制的特点,父类中被测试用例所测试的代码被子类继承,只要父类代码没有被子类“覆盖”,那么就不用重新创建这些测试用例。 图6-6显示了各类之间的继承关系:,图6 -6 类之间的继承关系,Class_A类有两个实例方法operation1()和operation2(),Class_B类继承了Class_A类并且实现了新的实例方法operation3(),Class_C类继承了Class_B类,覆盖了Class_B类的实例方法operation3()和实例方法operation2().,根据图6-6中这三个类之间的区别,可以确定继承的测试用例中是否需要产生新的子类测试用例,哪些测试用例适用于测试子类,哪些测试用例在测试子类中不必执行,如下表6-7所示:,由此,可以得出继承层次结构中类测试的测试用例可以采用如下增补原则: 1)如果子类新增了一个或者多个新的操作,就需要增加相应的测试用例。 2)如果子类定义的同名方法覆盖了父类的方法,就需要增加相应的测试用例。 那么,在具体构建类测试用例时可以采用如图6-7所示的结构。对于基类我们要全部测试,底层的测试类可以对其父类的测试方法回归。,图6-7 类测试用例的构建,二、接口类测试 对类进行测试时需要构建可执行的类实例,而接口不存在任何构造方法无法被实现。 由于接口一定会在某个类中实现,因此就使用一个实现接口的类来做测试。遵循以下原则: 如果接口没有被任何类实现就无需进行测试。 如果已被别的类实现,那么就针对实现该接口的类进行测试。 (如下图6-8),图6-8 InterFace接口测试类图,三、抽象类测试 如果要构造抽象类的测试驱动程序首先要继承测试驱动类,并且需要同时继承被测试抽象类,因为该类不能被具体化。但Java采用单继承机制,因此对该抽象类的测试驱动程序就不能同时继承两个抽象类,通常,采用以下两种方法来处理抽象类的测试问题: 1、一般情况下,利用Java的内类机制,在抽象类的测试驱动程序内引入内类,让内类实现对被测试抽象类的继承,然后把它作为引用体,这样对内类的测试就等价于对被测试抽象类的测试。举例如下:,/* AbstractExample.java *创建日期: *创建人员: *修改日期: *修改人员: */ package applet.unedu.tlpe.test; public abstract class AbstractExample implements Example public AbstractExample() ,/* AbstractExampleTester.java *创建日期: *创建人员: *修改日期: *修改人员: */ package applet.unedu.tlpe.test; public abstract class AbstractExampleTester extends TestCase static class AbstractExample_Inner extends AbstractExample public AbstractExample_Inner() super(argumentname); ,public AbstractExampleTester() super(argumentname); public Example newObject(argumentname) return new AbstractExample_Inner(); public void testAbstractExample_Inner() ,2、如果抽象类被具体类继承,那么,在创建该具体类的测试驱动程序时要继承抽象类的测试驱动程序,在以后的回归测试中,只要执行最低层的测试类,就可以对其父测试类重新执行一次测试,同时将测试结果分别返回。 四、重载和覆盖测试 覆盖是在子类中重新定义了从父类中继承的同名方法;重载与覆盖不同,不是子类对父类同名方法的重新定义,而是类对自身已有的同名方法的重新定义。 在测试过程中,可以参考如下两个原则: 要对类实例方法的所有重载形式分别进行测试。, 子类的测试驱动程序在继承父类测试驱动程序的同时,要对覆盖了父类的同名方法进行测试,而且应该重新对父类的类实例方法的所有重载形式执行一次测试。,package applet.unedu.tlpe.test; public class reload public reload() public int method_a() return “method_a()”; public int method_a(String a) return “method_a(String a)”; ,public int method_a(String a,String b) return “method_a(String a,String b)”; public int method_b() return “method_b()”; public int method_c() return “method_c()”; reload_TestCase为reload类的测试驱动程序,该类对reload类中包含的method_a实例方法的三种重载形式分别进行了测试,代码如下:,/* reload_TestCase .java */ package applet.unedu.tlpe.test; public class reload_TestCase extends TestCase public reload_TestCase(argument ) public void testMethod_a() public void testMethod_a_a() public void testMethod_a_ab() public void testMethod_b() public void testMethod_c() ,五、异常测试 因为存在异常,在构建测试用例时,还要考虑如何测试在某种特殊情况下程序代码是否返回了指定的状态。 6.4面向对象测试的层次 在传统软件中,确定单元的指导方针是: 1、能够自身编译的最小程序块; 2、单一过程/函数(独立); 3、由一个人完成的小规模工作。 面向对象软件测试与传统方法的区别:指导方针中没有明确说明是把类还是方法作为单元。 下面对分别以方法和类作为单元的测试进行简单的介绍和比较。, 以方法为单元 可以将面向对象单元测试归结为传统的单元测试。 可以使用所有传统功能性测试和结构性测试技术。 前期工作相对容易,但后续测试工作重。 以类为单元 面向对象测试的层次,取决于单元的构成,一般采用三层或四层方式。如果把单个操作或方法看作单元,则有四层测试,即操作/方法、类、继承和系统测试。 面向对象测试的主要问题是集成测试,可以看作是第三层,即在通过测试的类之间的交互测试。,6.5 Junit简介 Junit是用于测试使用Java语言编写的面向对象程序的单元级测试工具。 (由Eric Gamma及Kent Beck编写的,由SourceForge发行,使用许可证遵循IBMs common Public License Version 1.0公开版权规范) *优点* : 1、提升程序代码的质量的同时,Junit测试使我们能够更快速的编写程序。 2、Junit使用简单 3、Junit能够检验测试结果并立即提供反馈。,4、Junit测试可以组织成一个有层次的测试系列架构。 5、使用Junit开发测试成本低。 6、Junit测试提升软件的稳定性。 7、Junit测试是使用Java语言开发的。 8、Junit是免费的。 一、Junit的安装和配置 (略) 二、Junit的卸载步骤 (略) 三、支持Junit的Java IDE 目前主要有 Forte for Java 3.0 Enterprise Edition; JBuilder 6 Enterprise Edition; Visual Age for Java等 。,四、Junit的各种断言 Junit提供了一些用于帮助我们确定某个被测试函数是否正常工作的辅助函数,通常把这些函数称之为断言。可以判断某条件是否为真;两数据是否相等。 下面举出一些断言方法: AssertEquals(String message,expected,actual) expected参数代表期望值;actual参数代表被测试代码实际产生的值;message参数可选,常用于报告出错信息。 assertNull/ assertNotNull(String message,java.lang.Object object) 用来判断给定的对象是否为空/(是否为非空),如果答案为否,则会失败,同样message参数是可选的。,assertSame/assertNotSame (String message,expected,actual)验证expected参数和actual参数所引用的是否为/(不为)同一个对象,答案为否将会失败, assertTrue(String message, boolean condition)验证给定的二元条件是否为真,如果为假的话,将会失败 注意:当某个断言失败的时候,其所在的测试方法就会停止,也就是说剩余的断言将不会执行,此时应该先修复这个失败的测试再继续进行其他测试。另外,当有的测试失败时不能给原有代码添加新的特性!此时,应该尽快的修复这个错误,直到所有的测试都顺利通过。 五、Junit自动化测试框架 定义:就是可以对代码进行单元测试的框架。,简单的自动化测试框架应该满足如下几个要求: 1、能够以某种方式将测试用例组织成一个测试包,以便可以一次执行所有测试用例,尽量达到让实现人员或者测试人员按一个按钮就能完成所有的测试工作,并且输出清晰的测试结果的目的。 2、支持简单的操作,可以向测试包中添加任意多个测试用例,并且不影响测试包的正常运行。 3、支持测试随意组合(一个测试包可以包含其他的测试包)。 Junit的自动化测试框架如图6-9所示:,图6-9 Junit的自动化测试框架,Junit.Framework包中包含了Junit测试类所需的所有基类(Base Class),实际上这个包也是整个Junit的基础框架(Base_Framework)。TestCase类是这个包的核心,测试人员可在继承TestCase类的基础上开发自己的测试驱动程序。其余的类用来支持TestCase类,其中的TestSuite用来聚合多个测试用例(TestCase);Assert类用来验证期望值和实际值;TestResult类收集所有测试用例执行后的结果;在Test接口中建立了TestCase和TestSuite之间的关联,同时它也为整个测试框架作了扩展预留。 下面通过一段代码对Junit框架的使用进行简单介绍(包含了前面介绍的断言)。,Line 1 import junit.framework.*; /导入必需的Junit类库 2 public class TestSimple extends TestCase 3 public TestSimple(String name) 4 super(name); 5 6 public void testPlus() 7 assertEquals(2,3-1); 8 9 一个测试类会包含一些测试方法;每个方法可以包含一个或者多个断言语句,这些功能能满足最基本的测试要求。 但有时候希望在一个测试类中能调用其他测试类,或者测试人员可能只想运行一个测试类中的某些方法。可以通过创建Test suite来实现。,例如,给出如下一个类似TestSimple的测试驱动类,二者不同之处在于增加了一个静态的Test suite方法,通过suite()方法就可以返回任何想得到的测试集合(测试类中没有suite()方法时,Junit会自动运行所有以test为开头命名的方法)。代码如下: Line 1 import junit.framework.*; 2 public class TestSimple extends TestCase 3 public TestSimple(String name) 4 super(name); 5 6 public void testPlus() 7 assertEquals(2,3-1); 8 ,9 public void testAdd() 10 assertEquals(4,2+2); public void testMultiple() assertEquals(4,22); 15 public static Test suite() TestSuite suite=new TestSuite(); Suite.addTest( new TestClassOne(“testPlus”); Suite.addTest( 20 new TestClassOne(“testAdd”); return suite; ,六、环境的建立和清理 每个测试的运行是相互独立的,每次测试都要重新设置某些测试环境;在测试完成之后释放一些资源。 Junit中的TestCase基类就为我们提供了这样两个方法,可以分别用于环境的建立和清理: protected void setUp(); protected void teardown(); (例子详见教材) 七、JUnit支持两种运行单个测试的方法: 静态的和动态的方法。,1、静态的方法是覆盖TestCase类的runTest()方法,一般是采用内部类的方式创建一个测试实例: TestCase test01 = new testCar(“testgetWheels“) public void runTest() testGetWheels(); 2、动态的方法是用内省来实现runTest()以创建一个测试实例。这要求测试的名字就是需要调用的测试方法的名字: TestCase test01 = new testCar(“testGetWheels“);,八、Testsuite的使用 在JUnit中,任何测试类都能包含一个名为suite的静态方法,即:public static Test suite();在suite()方法中,将所需要的测试实例加到一个TestSuite对象中,并返回这个TestSuite对象。 因为TestSuite和TestCase都实现了Test接口,而Test接口定义了运行测试所需的方法。所以,在测试类执行的过程中,只有添加到TestSuite中的测试才能够被运行,因此不用去运行我们暂时还不需要的测试。 九、Junit中main方法的使用 使用方法如下:,public static void main(String args) Junit.textui.TestRunner.run(TestdrawbhTest.class); /使用文本交互模式启动该测试用例 Junit.awtui.TestRunner.run(TestdrawbhTest.class); /使用AWT图形交互模式启动该测试用例 Junit.swingui.TestRunner.run(TestdrawbhTest.class); /使用Swing图形交互模式启动该测试用例 十、Mock对象的使用 当某个方法依赖于其他一些难以操控的东西,诸如网络、数据库,甚至是servlet引擎时,测试的中使用mock对象作

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论