chap5面向对象软件测试_第1页
chap5面向对象软件测试_第2页
chap5面向对象软件测试_第3页
chap5面向对象软件测试_第4页
chap5面向对象软件测试_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

1、第5章 面向对象软件测试1第5章 面向对象软件的测试本章重点面向对象软件的特点什么是面向对象的单元?如何利用JUnit进行单元测试?2第5章 面向对象软件的测试5.1 概述5.2 面向对象的软件测试模型5.3 面向对象的单元测试5.4 JUnit测试5.5 面向对象的集成测试和系统测试35.1 概述1 对象定义针对对象的测试45.1 概述对象:定义对象是一个可操作的实体,它既包含了特定的数据,又包含了操作这些数据的代码,即方法。55.1 概述对象:针对对象的测试应考虑对象的封装对象的状态对象的生命周期对象的交互65.1 概述2 类定义对类的测试75.1 概述类:定义是通过抽象数据类型的方法实现

2、的一种数据类型,是具有共性的对象集合。85.1 概述类:对类的测试应考虑构造函数析构函数(Java语言不考虑)方法符合设计类设计原则:开闭原则、替换原则、依赖原则、接口分离原则95.1 概述3 封装定义:是将数据以及操作数据的方法关联起来,构成的一个具有类类型的对象的描述。 封装要求类高度内聚,且耦合很松。105.1 概述4 继承定义给测试带来的挑战115.1 概述继承:定义是类之间的一种联系,通过从某个类(称父类)派生可以得到一个新的类(称子类或派生类),该类具有父类的特点和功能,同时还具有新的特点和功能。125.1 概述继承:给测试带来的挑战缺陷传播重复测试135.1 概述5 多态定义:一

3、个对外接口,多个内在实现方法。分为参数多态和包含多态。一般通过动态测试来检查。145.1 概述6 消息对象之间通过消息的传递产生相互作用,通过消息来请求执行某个操作。 测试时应考虑消息的发送者消息的接收者消息所包含的参数 155.1 概述7 接口用于描述一系列规范的行为对接口的测试应注意接口包含的行为应与对应类的行为相符;接口往往与其他接口或类具有关系,应测试到所有可能的作用方式。 165.2 面向对象的软件测试模型面向对象的软件开发面向对象的分析(OOA)面向对象的设计(OOD)面向对象的编程(OOP)175.2 面向对象的软件测试模型面向对象的软件测试面向对象分析的测试(OOA)面向对象设

4、计的测试(OOA)面向对象编程的测试(OOA)面向对象的单元测试(OOUT)面向对象的集成测试(OOIT)面向对象的系统测试(OOST)185.3 面向对象的单元测试5.3.1 与传统单元测试的区别从单元的划分看从测试方法看从测试对象看195.3 面向对象的单元测试1 从单元划分看面向过程:以过程或功能作为单元划分的依据。面向对象:以类作为单元是否需要测试所有的类无法实例化的类如何测试继承的类如何测试205.3 面向对象的单元测试5.3.1 与传统单元测试的区别从单元的划分看从测试方法看从测试对象看215.3 面向对象的单元测试2 从测试方法看传统的单元测试:静态测试+动态测试面向对象的单元测

5、试:更强调自动化,不强调代码检查如何设计测试用例如何构造测试驱动程序,并避免巨大的工作量如何最大可能实现自动化的单元测试225.3 面向对象的单元测试5.3.1 与传统单元测试的区别从单元的划分看从测试方法看从测试对象看235.3 面向对象的单元测试3 从测试对象看传统的单元测试主要关注函数实现的功能如何通过接口传递数据或消息函数内部的逻辑和效率面向对象的单元测试主要关注类的方法类的状态245.3 面向对象的单元测试3 从测试对象看面向对象的单元测试应解决如何测试私有方法或受到保护的方法是否需要测试类中的所有方法255.3 面向对象的单元测试5.3.2 实施的基本步骤划分类的优先级静态测试(针

6、对不需单元测试的类)对需要执行单元测试的类设计测试用例开发测试驱动 执行测试,对测试结果进行总结 265.3 面向对象的单元测试5.3.3 类的优先级优先级的设定一般方法案例275.3 面向对象的单元测试1 设定优先级考虑的方法类在系统中所起的作用类自身的复杂度和与其他类之间的交互复杂度 开发该类的测试程序所需的成本 285.3 面向对象的单元测试5.3.3 类的优先级优先级的设定一般方法案例295.3 面向对象的单元测试2 一般方法该类所处层次的价值该类自身的复杂度值各子类的测试价值各子类的交互权值,反映出对父类的影响交互复杂度价值305.3 面向对象的单元测试5.3.3 类的优先级优先级的

7、设定一般方法案例315.3 面向对象的单元测试5.3.4 测试用例的设计案例说明根据代码设计测试用例根据前置条件和后置条件设计测试用例根据状态转换设计测试用例根据方法特性设计测试用例综合策略325.3 面向对象的单元测试1 案例说明MyPoint:二维平面上的一个点MyShape:二维平面上的基本形状MyLine:代表线段MyTriangle:代表三角形Scalene:不等边三角形Isosceles:等腰三角形335.3 面向对象的单元测试5.3.4 测试用例的设计案例说明根据代码设计测试用例根据前置条件和后置条件设计测试用例根据状态转换设计测试用例根据方法特性设计测试用例综合策略345.3

8、面向对象的单元测试2 根据代码设计测试用例公有方法(public)保护方法(protected)shorten()私有方法(private) extend()直接修改被测代码在被测类中加入公有方法利用内类机制见案例代码5.3.4节对MyLine类的相关方法的测试355.3 面向对象的单元测试5.3.4 测试用例的设计案例说明根据代码设计测试用例根据前置条件和后置条件设计测试用例根据状态转换设计测试用例根据方法特性设计测试用例综合策略365.3 面向对象的单元测试3 根据前置和后置条件设计测试用例定义前置条件是方法被执行之前应该满足的条件;后置条件是当方法执行结束之后应满足的条件。375.3 面

9、向对象的单元测试3 根据前置和后置条件设计测试用例组合情况1:当只有一个前置条件时,设计两个测试用例,分别满足:前置条件和后置条件同时成立;前置条件不成立,系统对例外的处理。385.3 面向对象的单元测试3 根据前置和后置条件设计测试用例组合情况2:当有两个前置条件,且缺一不可时,设计4个测试用例,分别满足两个前置条件和后置条件同时成立;两个前置条件中有一个条件不成立,系统对无效输入的处理;两个前置条件均不成立,系统对无效输入的处理。395.3 面向对象的单元测试3 根据前置和后置条件设计测试用例组合情况3:当有两个前置条件,且取一即可时,设计4个测试用例,分别满足两个前置条件中只有一个条件成

10、立,后置条件成立;两个前置条件和后置条件同时成立;两个前置条件均不成立,系统对无效输入的处理。405.3 面向对象的单元测试3 根据前置和后置条件设计测试用例组合情况4:当有更多前置条件时,应借鉴两个输入条件的情况来设计测试用例。可将前置条件和后置条件与决策表测试或等价类测试联系起来。415.3 面向对象的单元测试5.3.4 测试用例的设计案例说明根据代码设计测试用例根据前置条件和后置条件设计测试用例根据状态转换设计测试用例根据方法特性设计测试用例综合策略425.3 面向对象的单元测试4 根据状态转换设计测试用例状态转换图中清晰地列出了类可能处于的所有状态,每一对状态转换都涉及一个触发事件。

11、与功能图法部分类似。435.3 面向对象的单元测试5.3.4 测试用例的设计案例说明根据代码设计测试用例根据前置条件和后置条件设计测试用例根据状态转换设计测试用例根据方法特性设计测试用例综合策略445.3 面向对象的单元测试5 根据方法特性设计测试用例构造函数:测试各种情况下创建的对象能否正常初始化,尤其关注无效输入条件下的处理情况。功能函数:需结合边界值、等价类测试各种功能能否正确完成。接口函数:测试类能否在各种状态间成功转换。455.3 面向对象的单元测试5.3.4 测试用例的设计案例说明根据代码设计测试用例根据前置条件和后置条件设计测试用例根据状态转换设计测试用例根据方法特性设计测试用例

12、综合策略465.3 面向对象的单元测试6 综合策略根据方法特性划分:构造函数、功能函数和接口函数。针对构造函数,根据前置和后置条件设计用例。针对功能函数公有方法:基于前置条件和后置条件设计测试用例。受保护的方法:严格区分有访问权限和无访问权限的前置条件和后置条件,设计测试用例。私有方法:根据实际情况选用适当的策略进行测试。针对接口函数,根据状态转换设计测试用例。对于以上每种情况,都应结合边界值、等价类等测试方法来选择测试数据。475.3 面向对象的单元测试5.3.5 测试驱动的实现方式见案例代码5.3.5节对MyPoint类的构造函数的测试利用main方法嵌入静态方法独立的测试类测试驱动的设计

13、本质上是通过创建被测类的实例,并测试这些实例的行为来测试类。485.3 面向对象的单元测试5.3.6 测试代码的组织与产品代码放在一起在产品代码目录下与产品代码并行与产品代码的副本放在一起495.3 面向对象的单元测试5.3.7 测试驱动框架设计目标自动简单灵活设计思想TestCaseTestResult505.3 面向对象的单元测试5.3.7 测试驱动框架TestCase 的4类操作构建和执行测试用例 创建和操作被测类的Object实例 分析测试用例结果 将测试过程记录到日志文件 515.3 面向对象的单元测试5.3.8 案例实践一:类MyPoint的第一次测试尝试 525.3 面向对象的单

14、元测试5.3.9 类的质量度量白盒测试工具Logiscope给出了11个类质量度量元,包括注释频度、扇出、扇入、类对其他模块的依赖性、基类数量、环复杂度、类功能的专一性、易用性、封装性、被其它类使用的次数、类耦合情况、派生类数量、类自知程度、使用其它类的数目、易测试性等。535.3 面向对象的单元测试5.3.10 测试覆盖基于代码的覆盖基于前置条件和后置条件的覆盖基于状态的覆盖545.4 JUnit测试5.4.1 面临的问题提高软件的质量需要撰写测试程序;经良好设计和规划的测试类的代码不需要那么繁琐和冗长;通过借助于测试类的编写规范可以得到易于操作的测试,且不随时间变化。555.4 JUnit

15、测试5.4.2 JUnit简介Junit是用于测试使用Java语言编写的面向对象程序的单元级测试工具。由Eric Gamma及Kent Beck编写的,由SourceForge发行,使用许可证遵循IBMs common Public License Version 1.0公开版权规范。3个设计目标自动化测试框架确保代码持久有效支持测试代码的重用565.4 JUnit测试5.4.3 JUnit特性及优点特性利用断言assert*来测试实际执行结果是否符合预期结果;利用测试用例TestCase和测试包TestSuite方便地组织和运行测试;通过文本运行器textui、图形运行器awtui和swin

16、gui提供灵活的交互模式。575.4 JUnit测试5.4.3 JUnit特性及优点在支持测试方面,JUnit的优点将测试代码与产品代码分开,提高了软件的可维护性;针对某个类的测试代码经少量改动之后即可应用于另一个类的测试,简化了测试代码的撰写,提高了测试代码的复用程度;公开源代码,便于进行二次开发,且便于扩展。585.4 JUnit测试5.4.3 JUnit特性及优点就对软件开发与过程的支持而言,JUnit有助于加快开发速度;提高软件代码质量;提升系统的可信赖度。595.4 JUnit测试5.4.4 JUnit下载与安装及使用一、Junit的安装和配置二、Junit的卸载步骤三、支持Juni

17、t的Java IDE四、Junit的各种断言五、Junit自动化测试框架 六、Mock对象的使用60一、Junit的安装和配置安装jdk工具包;从网站下载Junit压缩包junit3.8.1.zip,将其解压到一个物理目录中(例如:C:junit3.8.1);在环境变量classpath中添加C:junit3.8.1junit.jar;61二、Junit的卸载步骤删除Junit解压缩包;删除环境变量classpath中junit.jar所在路径,即C:junit3.8.1junit.jar;62三、支持Junit的Java IDE目前主要有Forte for Java 3.0 Enterpri

18、se Edition; JBuilder XX Enterprise Edition; Visual Age for Java; Eclipse等 。63四、Junit的各种断言Junit提供了一些用于帮助我们确定某个被测试函数是否正常工作的辅助函数,通常把这些函数称之为断言。可以判断某条件是否为真;两数据是否相等。 assertEquals(String message, expected, actual) expected参数代表期望值;actual参数代表被测试代码实际产生的值;message参数可选,常用于报告出错信息。 assertNull/ assertNotNull(String

19、 message, java.lang.Object object) 用来判断给定的对象是否为空/(是否为非空),如果答案为否,则会失败,同样message参数是可选的。64四、Junit的各种断言(续) assertSame/assertNotSame (String message,expected,actual) 验证expected参数和actual参数所引用的是否为/(不为)同一个对象,答案为否将会失败 assertTrue(String message, boolean condition) 验证给定的二元条件是否为真,如果为假的话,将会失败 注意:当某个断言失败的时候,其所在的测

20、试方法就会停止,也就是说剩余的断言将不会执行,此时应该先修复这个失败的测试再继续进行其他测试。另外,当有的测试失败时不能给原有代码添加新的特性!此时,应该尽快的修复这个错误,直到所有的测试都顺利通过。65五、Junit自动化测试框架定义:就是可以对代码进行单元测试的框架。简单的自动化测试框架应该满足如下几个要求: 1、能够以某种方式将测试用例组织成一个测试包,以便可以一次执行所有测试用例,尽量达到让实现人员或者测试人员按一个按钮就能完成所有的测试工作,并且输出清晰的测试结果的目的。2、支持简单的操作,可以向测试包中添加任意多个测试用例,并且不影响测试包的正常运行。3、支持测试随意组合(一个测试

21、包可以包含其他的测试包)。66Junit的自动化测试框架TestCasesetUp()teardown()MyTestCaseTestrun()TestSuiteaddTest() TestCase类是这个包的核心,测试人员可在继承TestCase类的基础上开发自己的测试驱动程序。 TestSuite用来聚合多个测试用例(TestCase)。67 junit.framework包中包含了Junit测试类所需的所有基类(Base Class),实际上这个包也是整个Junit的基础框架(Base_Framework)。TestCase类是这个包的核心,测试人员可在继承TestCase类的基础上开发

22、自己的测试驱动程序。其余的类用来支持TestCase类,其中的TestSuite用来聚合多个测试用例(TestCase);Assert类用来验证期望值和实际值;C:junit3.8.1javadocjunitframeworkAssert.htmlTestResult类收集所有测试用例执行后的结果;在Test接口中建立了TestCase和TestSuite之间的关联,同时它也为整个测试框架作了扩展预留。 五、Junit自动化测试框架(续)681 import junit.framework.*; /导入必需的Junit类库2 public class TestSimple extends Te

23、stCase/定义的类必须继承TestCase类3 public TestSimple(String name)/构造方法4 super(name);5 6 public void testPlus()/测试方法一般形如testXXX(),会被自动执行7 assertEquals(2,3-1); /断言语句8 9 一个测试类会包含一些测试方法;每个方法可以包含一个或者多个断言语句,这些功能能满足最基本的测试要求。 但有时候希望在一个测试类中能调用其他测试类,或者测试人员可能只想运行一个测试类中的某些方法。可以通过创建suite( )来实现。 1、一个简单的Junit范例692、引入suite(

24、)方法的Junit范例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);11 7012 public void testMultiple()13 assertEquals(4,2*2);14 15 public stati

25、c Test suite()16 TestSuite suite=new TestSuite();17 suite.addTest(new TestSimple (“testPlus”);18 suite.addTest(new TestSimple (“testAdd”);19 return suite;20 21 通过suite()方法就可以返回任何想得到的测试集合,在测试类执行的过程中,只有添加到suite()方法中的测试才能够被运行,因此不用去运行我们暂时还不需要的测试。(测试类中没有suite()方法时,Junit会自动运行所有以test为开头命名的方法)。71引申:(1)如何引入其

26、他类中的测试方法?(2)如何在suite()方法中一次引入本类的所有测试方法?(3)Junit支持几种运行单个测试的方法?72引申:(1)如何引入其他类中的测试方法?suite.addTestSuite(ClassName1.class); /引入ClassName1中的所有测试方法。suite.addTest(ClassName2.suite(); /引入ClassName2中suite()方法中引用的测试方法。73引申:(2)如何在suite()方法中一次引入本类的所有测试方法?只需将类传递给TestSuite,Junit会根据测试方法名自动创建相应的测试实例。例如:public stat

27、ic Test suite() return new TestSuite(TestSimple.class); 74引申:(3)Junit支持几种运行单个测试的方法?Junit支持两种运行单个测试的方法:动态的方法和静态的方法。动态的方法就是用内省来实现TestCase类的runTest()以创建一个测试实例,要求测试的名字就是需要调用的测试方法的名字。 suite.addTest(new TestSimple (“testPlus”);静态的方法就是覆盖TestCase类的runTest()方法,一般采用内部类的方式创建一个测试实例,如: suite.addTest( new TestSimple(“plus) protected void runTest() testPlus(); );753、环境的建立和清理 每个测试的运行是相互独立的,每次测试都要重新设置某些测试环境;在测试完成之后释放一些资源。 Junit中的TestCase基类就为我们提供了这样两个方法,可以分别用于环境的建立和清理: protected void setUp(); protected void tearDown(); 例如:同数据库建立连接可在setUp()实现,释放连接可在 tear

温馨提示

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

评论

0/150

提交评论