1、 第第5章章 面向对象软件的测试面向对象软件的测试5.1 面向对象的测试概述面向对象的测试概述5.1.1 面向对象的基本概念面向对象的基本概念 面向对象可以看成是现实世界模型的自然延伸,现实世界中的任何实体都可以看成是对象。传统的过程式编程语言是以过程为中心,以算法为驱动。因此,过程式编程语言是:程序=算法+数据;而面向对象的编程语言是以对象为中心,以消息为驱动。因此,面向对象的编程语言是:程序=对象+消息。面向对象的软件开发以六个重要的基本概念为核心:对象、类、继承、多态、消息和接口。5.1.2 面向对象的测试内容面向对象的测试内容 1对象对象 2类类 3封装封装 4继承继承 5多态多态 6
2、消息消息 7接口接口5.1.3 面向对象的测试模型面向对象的测试模型 需求测试。设计测试。单元测试。子系统测试。系统集成测试。接受测试。5.2 面向对象的单元测试面向对象的单元测试5.2.1 基本步骤基本步骤 1)划分类的优先级 2)静态测试 3)对需要执行单元测试的类设计测试用例 4)开发测试驱动 5)执行测试,对测试结果进行总结5.2.2 类的优先级类的优先级 1、类的优先级的设定、类的优先级的设定 1)类在系统中所起的作用 2)类自身的复杂度和与其他类之间的交互复杂度 3)开发该类的测试程序所需的成本5.2.2 类的优先级类的优先级 2优先级设定的一般方法优先级设定的一般方法 由于测试程
3、序的开发成本不便于估算,因此,一般仅从前两个方面来计算类的测试价值,通过将测试价值量化来设定类的测试优先级,该值越大,对应类的测试优先级别越高。5.2.3 测试用例的设计测试用例的设计 1、案例说明、案例说明MyShape 2.根据代码设计用例根据代码设计用例 3根据前置条件和后置条件根据前置条件和后置条件 6.综合策略综合策略 5.根据方法特性根据方法特性5.2.4 测试驱动的实现方式测试驱动的实现方式 测试用例实际上属于一个静态的概念,若没有测试脚本的支持,则测试用例只能以手工方式在调试环境下执行,大量人力劳动都将耗费在测试数据的设定、程序的执行、Watch窗口或Output窗口的观察等简
4、单重复的工作上,不仅效果差,容易出错,而且完全不利于回归测试。单元测试一定要实现自动化,必须通过设计测试驱动程序,让测试用例自动执行、执行结果自动检验、测试报告自动给出。测试驱动的设计本质上是通过创建被测类的实例和测试这些实例的行为来测试类,但测试驱动的形式是多种多样的。下面介绍常见的测试驱动设计方法。1.利用利用main方法方法 在被测类中,利用main方法来实现测试驱动是一个最为简便的方式不需要考虑被测方 法的访问权限,不需要考虑被测程序的文件管理,直接将每个测试都写入main方法,测试结果可直接输出到屏幕。用main方法,能够撰写测试代码并可快速观察到测试结果,但是导致的直接后果是:测试
5、代码与开发代码混在一起,测试完毕后需将测试代码从开发代码中删去,这样完全无法进行回归测试,难以维护和复用测试代码。2.嵌入静态方法嵌入静态方法 在被测类中嵌入静态方法,在静态方法内部实现测试用例的执行,测试结果直接输出到屏幕,且不需要考虑被测方法的访问权限。当需要测试时,在别的地方调用这些静态方法即可。用嵌入静态方法,不需要将被测试类实例化就可以直接测试,但是测试代码仍与开发代码放在一个文件中,测试完毕后需要将测试代码从开发代码中删除,并且不能从根本上解决回归测试问题。3.独立的测试类独立的测试类为了便于组织测试代码和便于回归测试,应将测试代码从开发代码中完全独立出来,建立独立的测试类。测试类
6、可以处理被测类的实例化、对类的方法的测试、测试结果的自动检验和测试通过或失败的统计等。创建独立于被测类的测试驱动类可以真正实现测试代码与开发代码的相互独立,完全自动化的测试可以大大提高回归测试的效率,提高单元测试的效果,缩短集成测试的时间,同时确保软件的质量。然而,撰写和维护测试代码将给开发人员带来额外的工作量,迫于进度的压力,开发人员往往疲于写代码,没有时间来写测试程序,且随着需求、设计的变化,被测类代码也会发生变化,测试驱动类需要密切关注被测类的这些变化,这在另外一个层面上也间接导致了开发人员不愿意写测试代码。总体而言,独立的测试类能够起到事半功倍的效果,是开发人员应首先选择用来实现测试驱
7、动的方法,但要注意的是应尽量利用现成的自动化单元测试工具来辅助编码,使得开发人员以最少的时间和精力来撰写最有效的测试代码,否则没有人愿意做这些额外的工作。5.2.5 测试驱动框架和代码的组织测试驱动框架和代码的组织 1测试驱动框架测试驱动框架 2代码组织代码组织1测试驱动框架测试驱动框架 1)设计目标设计目标 自动 简单 灵活 2)设计思想)设计思想 构建和执行测试用例 创建和操作被测类的Object实例 分析测试用例结果 将测试过程记录到日志文件5.2.5 测试驱动框架和代码的组织测试驱动框架和代码的组织 2代码组织代码组织 1)与产品代码放在一起 2)放在产品代码的目录下 4)与产品代码的
8、副本放在一起 3)与产品代码并行5.3 面向对象的集成测试和系统测试面向对象的集成测试和系统测试 1集成测试集成测试 传统的集成测试方法包括自顶向下、自底向上和三明治方法。集成测试需要进行仔细的规划,其中继承测试应该在一个类继承另一个类后尽快进行。类层、测试策略,因此系统集成需要不同类型的集成测试策略。2系统测试系统测试 集成后的系统测试是软件测试生命周期中一个主要阶段。把测试活动分布到不同阶段除了可以在早期阶段识别错误外,也能减少在单独一个阶段中需要的工作量。系统测试包括健全测试、文档测试、性能测试、压力测试和边界测试。系统测试是在软件开发生命周期最后阶段执行的一种测试,从广义上讲,系统测试
9、可以包括集成后的系统测试和接收测试。根据机构和被测试软件情况,alfa测试、Bata测试或其它任何形式的测试都可以作为该测试方式的补充。系统测试的主要目标是通过在一段时间内观察其行为,确定软件系统是否为交付用户做好准备。它对集成后的整个系统进行测试,判断是否与需求一致。5.4 面向对象软件的测试工具面向对象软件的测试工具5.4.1 JUnit介绍介绍 JUnit是一个开放源代码的Java测试框架;是迄今所开发的最重要的第三方Java库由Eric Gamma和Kent Beck(XP方法论和Refacotr的先驱之一)开发。同时,它引导并促进了测试的盛行,使得Java代码变得更健壮、更可靠,缺陷
10、也比以前更少。作为一个优秀的单元测试框架,JUnit用于编写和运行可重复的测试,是专门针对Java代码的单元测试,主要用于白盒测试和回归测试。JUnit还可以扩展用于功能测试、性能测试等。5.4.2 JTest介绍介绍JTest是Parasoft公司开发的一款针对Java语言的自动化白盒测试工具,通过自动实现Java的单元测试和代码标准效验,来提高代码的可靠性。JTest先分析每个Java类,然后自动生成JUnit测试用例并执行测试用例,从而实现代码的最大覆盖,并将代码运行时未处理的异常情况显露出来。同时,它也可以检查DbC(Desgin by Contract)规范开发的代码的正确性。用户还
11、可以通过扩展测试用例的自动生成起来添加更多的JUnit用例。JTest还能按照现有的超过350个编码标准来检查并自动纠正大多数常见的编码规则上的偏差,用户可自定义这些标准,通过简单的几个点击,就能预防类似于未处理异常、函数错误、内存泄露、性能问题、安全隐患这样的代码问题。另外,JTest采用Parasoft公司的AEP方法论来实现团队开发中队代码错误的标准化管理,这个方法论,也是Parasoft提出的机遇团队开发模式下提到软件质量和可靠性的一套解决方案,其目前还处于探索阶段。5.5 综合案例综合案例5.6 本章小结本章小结 面向对象为软件开发提供了一个新方向,能提高软件可重用性、可扩展性、互操作性和可靠性。面向对象软件以一种迭代和增量的方式开发。面向对象方法的三种基本特征是封装、多态和继承。信息隐藏作为一种设计方式,它只允许模块属性的一部分、公共接口被外部所知。多态作为一种重要的概念,可以用来构造灵活地系统。继承是一种重用形式,程序员可以通过重用以前定义的对象增量式地定义新对象。