




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象软件的测试面向对象软件的测试 本章要点本章要点 面向对象软件的测试与传统软件的区别; 类测试价值的评估方法; 类测试用例设计方法; 特殊类的测试方法; 划分面向对象软件测试的方法; 开源工具Junit的使用方法。 本章目标本章目标 了解面向对象的测试与传统软件测试的异同; 掌握类测试的基础知识; 重点理解针对抽象类以及接口类等特殊类的测试技巧,设计类测试用例和测试驱动程序的几种方法; 初步了解Junit,并掌握安装和卸载此工具的方法,以及如何使用它进行简单的测试。 面向对象的测试与传统测试的比较面向对象的测试与传统测试的比较 传统的测试计算机软件的策略是从“小型测试”开始,逐步走向“大
2、型测试”,且单元测试集中在最小的可编译程序单位子程序。 面向对象程序的结构不再是传统的功能模块结构,而是作为一个整体,并且对每个开发阶段都有不同以往的要求和结果,已经不可能用功能细化的观点来检测面向对象分析和设计的结果。 面向对象的软件测试分为:面向对象分析的测试,面向对象设计的测试,面向对象编程的测试, 面向对象单元测试,面向对象集成测试,面向对象系统测试。 1、传统的面向过程分析与面向对象分析(OOA) 2、结构化的设计方法与面向对象设计(OOD) 3、典型的面向对象程序具有继承、封装和多态的新特性。 4、传统的单元测试的对象是软件设计的最小单位模块。 5、传统的集成测试,主要有两种通过集
3、成完成的功能模块进行测试的方式:自顶向下集成 自底向上集成。 6、为了保证软件的功能完整性,除了单元测试和集成测试,还必须经过规范的系统测试。信息隐蔽对测试的影响信息隐蔽对测试的影响 类的重要作用之一是信息隐蔽。它对类中所封装的信息的存取进行控制,从而避免类中有关实现细节的信息被错误地使用。该隐蔽机制给测试带来了困难。封装和继承对测试的影响封装和继承对测试的影响 若一个类得到了充分的测试,当其被子类继承若一个类得到了充分的测试,当其被子类继承后,继承的方法在子类的环境中的行为特征需要后,继承的方法在子类的环境中的行为特征需要重新测试。重新测试。 多态性对测试的影响多态性对测试的影响 传统软件测
4、试中经常使用静态分析技术对代码进行分析;面向对象软件中,由于动态绑定和多态性的存在所带来的不确定性,给测试覆盖率的满足增大了难度。类测试基础类测试基础 1 1、类测试概念、类测试概念:验证类的实现是否和该类的说明完全一致。 2 2、类测试的方法、类测试的方法:通过代码检查或执行测试用例的方法来有效地进行类测试。(后者优于前者)。 3 3、类测试人员、类测试人员 类测试通常由开发人员来进行;(会带来好处和不足之处)。4 4、类测试时间、类测试时间 类的测试伴随着开发过程中的各个阶段,当类的说明或实现发生变化时应该执行回归测试。5 5、类测试过程、类测试过程 为类创建实例-创造适当的环境-运行测试
5、用例(向一个实例发送一个或多个消息)-通过参数来检查测试运行的结果-清除执行测试用例所需的测试环境。 类在类在UMLUML中的描述中的描述 UML(Unified Modeling Language)语言是一种支持对象技术的建模语言,是在计算机系统中表示真实世界的语言,描述真实世界中的对象和它们之间的关系,支持应用的开发。 在UML中,用来表示类的符号是矩形,并划分为三个区域,分别是: 名称区域:显示类的名称 属性区域:显示在类中定义的变量。 操作区域:显示在类中定义的方法。 如图-1所示:ClassNameAttributesOperation()ClassNameAttributesOpe
6、ration()InterfaceOperation()具体类抽象类接口类图-1 类的UML表示法 类之间的关系分为六类,分别是关联、泛化、实现、依赖、聚合和组合。每种关系分别使用不同的符号来表示(如:表-1所示),并分别用私有的、保护的和公有的三个关键字来修饰类(如:表-2所示)。表-1 UML类图符号描述 关键词UML符号说明泛化关联实现依赖聚合组合同一层次可见用作定义其他类的基类用作定义其他类的接口一方调用另一方的部分一方是另一方的部分一方是另一方的必要组成部分1.n1表-2 UML类图作用域描述类测试的价值类测试的价值 选择将每个类作为一个单元进行单独的测试,还是将其同其他类绑定进行集
7、成测试,需要使用如下3个要素来进行测试价值的评估:关键词UML符号说明私有保护公有-#+私有的,只在当前类中可见保护的,只对继承的类中可见公共的,所有的关联对象都是可见的 1、类本身的复杂程度 2、类在整个系统中的层次 3、开发该类测试驱动程序需要投入的成本 4、类本身的风险程度类测试用例设计类测试用例设计 一般基于如下一般基于如下3个标准设计测试系列,即基于个标准设计测试系列,即基于状态的覆盖率、基于限制的覆盖率和基于代码的状态的覆盖率、基于限制的覆盖率和基于代码的覆盖率。覆盖率。 设计测试用例的方法有多种: (例子详见教材) 1、根据前置和后置条件确定测试用例 2、根据状态转换确定测试用例
8、 3、根据访问控制修饰符(限定类、属性或方法被程序里的其他部分访问和调用的修饰符)来确定测试用例。 类测试驱动程序设计类测试驱动程序设计 从开发的角度:测试驱动的基本思想是在对设计 之前先考虑好测试代码; 从测试的角度:为了执行测试,运行测试用例, 找出软件中隐藏的BUG。 因此,测试驱动程序的构建应该简单、透明、易维护,能够提供尽可能多的服务,同时兼顾自增量更新,更理想的情况就是能够复用已存在的测试驱动程序的代码。 编写类测试驱动程序的方法有很多种 ,以Java语言为例来说明测试驱动程序设计的结构。 (主要以两票系统为例讲解,详见教材) 1、在main方法中写入需要运行的测试用例,即实现ma
9、in方法,然后编译、执行该类。 2、在类中实现一个静态测试方法,通过调用该测试方法来收集每个测试用例的执行结果。 3、实现独立的测试类,它的职责是执行并收集每个测试用例的结果。 类测试的延伸类测试的延伸 本节将简要介绍类测试构造思想以及如何对接口类、抽象类等进行测试的方法。 一、继承层次结构中类的测试 继承是实现接口和代码复用的有效机制。根据继承机制的特点,父类中被测试用例所测试的代码被子类继承,只要父类代码没有被子类“覆盖”,那么就不用重新创建这些测试用例。 图-6显示了各类之间的继承关系: Class_A+operation1()+operation2()Class_B+operation
10、3()Class_C+operation2()+operation3()图-6 类之间的继承关系Class_A类有两个实例方法operation1()和operation2(),Class_B类继承了Class_A类并且实现了新的实例方法operation3(),Class_C类继承了Class_B类,覆盖了Class_B类的实例方法operation3()和实例方法operation2(). 根据图-6中这三个类之间的区别,可以确定继承的测试用例中是否需要产生新的子类测试用例,哪些测试用例适用于测试子类,哪些测试用例在测试子类中不必执行,如下表-7所示:类继承类类方法是否改变是否增加测试用例
11、Class_AClass_BClass_BClass_AClass_Coperation1()operation2()operation3()operation2()operation1()operation3()operation2()operation1()FalseFalseFalseTrueTrueTrueFalseFalseTrueFalseTrueTrue 由此,可以得出继承层次结构中类测试的测试用例可以采用如下增补原则: 1)如果子类新增了一个或者多个新的操作,就需要增加相应的测试用例。 2)如果子类定义的同名方法覆盖了父类的方法,就需要增加相应的测试用例。 那么,在具体构建类测
12、试用例时可以采用如图-7所示的结构。对于基类我们要全部测试,底层的测试类可以对其父类的测试方法回归。 Class_A+operation1()+operation2()Class_B+operation3()Class_C+operation2()+operation3()Class_A_TestCase+testoperation1()+testoperation2()Class_B_TestCase+testoperation3()Class_C_TestCase+testoperation2()+testoperation3()图-7 类测试用例的构建 二、接口类测试 对类进行测试时需要
13、构建可执行的类实例,而接口不存在任何构造方法无法被实现。 由于接口一定会在某个类中实现,因此就使用一个实现接口的类来做测试。遵循以下原则:l如果接口没有被任何类实现就无需进行测试。l如果已被别的类实现,那么就针对实现该接口的类进行测试。(如下图-8)Class_C+Class_C+a_Method()+b_Method()+c_Method()Class_C_TestCase+Class_C_TestCase()+a_Method()+b_Method()+c_Method()+newObject()+testA_Method()+testB_Method()+testB_Method()In
14、terface_A+a_method()+b_method()图-8 InterFace接口测试类图 三、抽象类测试 如果要构造抽象类的测试驱动程序首先要继承测试驱动类,并且需要同时继承被测试抽象类,因为该类不能被具体化。但Java采用单继承机制,因此对该抽象类的测试驱动程序就不能同时继承两个抽象类,通常,采用以下两种方法来处理抽象类的测试问题: 1、一般情况下,利用Java的内类机制,在抽象类的测试驱动程序内引入内类,让内类实现对被测试抽象类的继承,然后把它作为引用体,这样对内类的测试就等价于对被测试抽象类的测试。举例如下: /* AbstractExample.java*创建日期:*创建人
15、员:*修改日期:*修改人员:*/package applet.unedu.tlpe.test;public abstract class AbstractExample implements Examplepublic AbstractExample()/*AbstractExampleTester.java*创建日期:*创建人员:*修改日期:*修改人员:*/package applet.unedu.tlpe.test;public abstract class AbstractExampleTester extends TestCasestatic class AbstractExample
16、_Inner extends AbstractExamplepublic AbstractExample_Inner()super(argumentname);public AbstractExampleTester()super(argumentname);public Example newObject(argumentname)return new AbstractExample_Inner();public void testAbstractExample_Inner() 2、如果抽象类被具体类继承,那么,在创建该具体类的测试驱动程序时要继承抽象类的测试驱动程序,在以后的回归测试中,只
17、要执行最低层的测试类,就可以对其父测试类重新执行一次测试,同时将测试结果分别返回。 四、重载和覆盖测试 覆盖是在子类中重新定义了从父类中继承的同名方法;重载与覆盖不同,不是子类对父类同名方法的重新定义,而是类对自身已有的同名方法的重新定义。 在测试过程中,可以参考如下两个原则: 要对类实例方法的所有重载形式分别进行测试。 子类的测试驱动程序在继承父类测试驱动程序的同时,要对覆盖了父类的同名方法进行测试,而且应该重新对父类的类实例方法的所有重载形式执行一次测试。 package applet.unedu.tlpe.test;public class reload public reload()p
18、ublic 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类中包含的
19、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
20、() 五、异常测试 因为存在异常,在构建测试用例时,还要考虑如何测试在某种特殊情况下程序代码是否返回了指定的状态。 面向对象测试的层次面向对象测试的层次 在传统软件中,确定单元的指导方针是: 1、能够自身编译的最小程序块; 2、单一过程/函数(独立); 3、由一个人完成的小规模工作。 面向对象软件测试与传统方法的区别:指导方针中没有明确说明是把类还是方法作为单元。 下面对分别以方法和类作为单元的测试进行简单的介绍和比较。 以方法为单元 可以将面向对象单元测试归结为传统的单元测试。 可以使用所有传统功能性测试和结构性测试技术。 前期工作相对容易,但后续测试工作重。 以类为单元 面向对象测试的层次
21、,取决于单元的构成,一般采用三层或四层方式。如果把单个操作或方法看作单元,则有四层测试,即操作/方法、类、继承和系统测试。 面向对象测试的主要问题是集成测试,可以看作是第三层,即在通过测试的类之间的交互测试。 JunitJunit简介简介 Junit是用于测试使用Java语言编写的面向对象程序的单元级测试工具。 (由Eric Gamma及Kent Beck编写的,由SourceForge发行,使用许可证遵循IBMs common Public License Version 1.0公开版权规范) *优点* : 1、提升程序代码的质量的同时,Junit测试使我们能够更快速的编写程序。 2、Jun
22、it使用简单 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的各种断言 Ju
23、nit提供了一些用于帮助我们确定某个被测试函数是否正常工作的辅助函数,通常把这些函数称之为断言。可以判断某条件是否为真;两数据是否相等。 下面举出一些断言方法: AssertEquals(String message,expected,actual) expected参数代表期望值;actual参数代表被测试代码实际产生的值;message参数可选,常用于报告出错信息。 assertNull/ assertNotNull(String message,java.lang.Object object) 用来判断给定的对象是否为空/(是否为非空),如果答案为否,则会失败,同样message参数是可
24、选的。 assertSame/assertNotSame (String message,expected,actual)验证expected参数和actual参数所引用的是否为/(不为)同一个对象,答案为否将会失败, assertTrue(String message, boolean condition)验证给定的二元条件是否为真,如果为假的话,将会失败 注意:当某个断言失败的时候,其所在的测试方法就会停止,也就是说剩余的断言将不会执行,此时应该先修复这个失败的测试再继续进行其他测试。另外,当有的测试失败时不能给原有代码添加新的特性!此时,应该尽快的修复这个错误,直到所有的测试都顺利通过。
25、 五、Junit自动化测试框架 定义:就是可以对代码进行单元测试的框架。 简单的自动化测试框架应该满足如下几个要求: 1、能够以某种方式将测试用例组织成一个测试包,以便可以一次执行所有测试用例,尽量达到让实现人员或者测试人员按一个按钮就能完成所有的测试工作,并且输出清晰的测试结果的目的。2、支持简单的操作,可以向测试包中添加任意多个测试用例,并且不影响测试包的正常运行。3、支持测试随意组合(一个测试包可以包含其他的测试包)。 Junit的自动化测试框架如图-9所示:TestCasesetUp()teardown()MyTestCaseTestRun()TestSuiteaddTest()图-9
26、 Junit的自动化测试框架 Junit.Framework包中包含了Junit测试类所需的所有基类(Base Class),实际上这个包也是整个Junit的基础框架(Base_Framework)。TestCase类是这个包的核心,测试人员可在继承TestCase类的基础上开发自己的测试驱动程序。其余的类用来支持TestCase类,其中的TestSuite用来聚合多个测试用例(TestCase);Assert类用来验证期望值和实际值;TestResult类收集所有测试用例执行后的结果;在Test接口中建立了TestCase和TestSuite之间的关联,同时它也为整个测试框架作了扩展预留。
27、下面通过一段代码对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 一个测试类会包含一些测试方法;每个方法可以包含一个或者多个断言语句,这些功能能满足最基本的测试要求。 但有时候希望在一个测试类中能调用其他
28、测试类,或者测试人员可能只想运行一个测试类中的某些方法。可以通过创建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(n
29、ame); 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
30、”); return suite; 六、环境的建立和清理 每个测试的运行是相互独立的,每次测试都要重新设置某些测试环境;在测试完成之后释放一些资源。 Junit中的TestCase基类就为我们提供了这样两个方法,可以分别用于环境的建立和清理: protected void setUp(); protected void teardown(); (例子详见教材)七、JUnit支持两种运行单个测试的方法: 静态的和动态的方法。 1、静态的方法是覆盖TestCase类的runTest()方法,一般是采用内部类的方式创建一个测试实例: TestCase test01 = new testCar(tes
31、tgetWheels) public void runTest() testGetWheels(); 2、动态的方法是用内省来实现runTest()以创建一个测试实例。这要求测试的名字就是需要调用的测试方法的名字: TestCase test01 = new testCar(testGetWheels); 八、Testsuite的使用 在JUnit中,任何测试类都能包含一个名为suite的静态方法,即:public static Test suite();在suite()方法中,将所需要的测试实例加到一个TestSuite对象中,并返回这个TestSuite对象。 因为TestSuite和Te
32、stCase都实现了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(Testdrawbh
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 代偿合同范例
- 工作个人计划总结模版
- 百日冲刺校长发言稿模版
- 从办公自动化到智能管理看区块链如何重塑企业生态圈
- 机器人焊接 12 项目六任务6.2教学设计
- 企业内部通信与协作的数字化转型-以区块链为例
- 温州市普通高中2025届高三第三次适应性考试生物试题及答案
- 假冒购货合同范例
- 医疗物资供应链中区块链技术的安全保障
- 医疗大数锯的隐私保护从数据科学到实践应用
- 我骄傲我是中国人诗歌朗诵背景
- 2022年陕西省普通高中学业水平考试生物试题 含答案
- 新汉语水平考试HSK三级真题(附答案)
- 中考语文复习之图文转换课件
- 钢框架计算书
- 高中1.安培力冲量模型(PPT讲解版)
- 中央企业违规经营责任追究实施办法解读共40张课件
- Excel模板-中国地图填色图
- 用户思维课件
- 中国石油天然气集团公司建设项目其他费用和相关费用的规定
- 邹萃文书法《惜时如金》课件
评论
0/150
提交评论