应用设计模式编写易于单元测试的代码
2008-07-27 15:18
363 查看
引言
设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述,通过在系统设计中引入合适的设计模式可以为系统实现提供更大的灵活性,从而有效地控制变化,更好地应对需求变更或者按需变更系统运行路径等问题。
单元测试是软件开发的一个重要组成部分,是与编码实现同步进行的开发活动,这一点已成为软件开发者的共识。适度的单元测试不但不会影响开发进度,反而可以为开发过程提供很好的控制,为软件质量、系统重构等提供有力的保障,并且,当后续系统需求发生变更、Bug
Fix 或功能扩展时,能很好地保证已有实现不会遭到破坏,从而使得程序更易于维护和修改。 Martin Fowler、Kent Beck、Robert
Martin 等软件设计领域泰斗更是极力倡导测试先行的测试驱动开发(Test Driven Development,TDD)的开发方式。
单元测试主要用于测试细粒度的程序单元,如类的某个复杂方法的正确性,也可以根据需要综合测试某个操作所涉及的多个相互联系的类的正确性。在很多情况下,相互联系的多个类中有些类比较简单,为这些简单类单独编写单元测试用例往往不如将它们与使用它们的类一起进行测试有意义。
模拟对象(Mock
Objects)是为模拟被测试单元所使用的外围对象、设备(后文统一简称为外部对象)而设计的一种特殊对象,它们具有与外部对象相同的接口,但实现往往比较简单,可以根据测试的场景进行定制。由于单元测试不是系统测试,方便、快速地被执行是单元测试的一个基本要求,直接使用外部对象往往需要经过复杂的系统配置,并且容易出现与欲测试功能无关的问题;对于一些异常的场景,直接使用外部对象可能难以构造,而通过设计合适的
Mock Objects,则可以方便地模拟需要的场景,从而为单元测试的顺利执行提供有效的支持。
本文根据笔者经验,介绍了几种典型的设计模式在系统设计中的应用,及由此为编写单元测试带来的方便。
从对象创建开始
由于需要使用 Mock Objects 来模拟外部对象的功能,因此必须修改正常的程序流程,使得被测试功能模块与 Mock
Objects,而不是外部对象进行交互。要做到这一点,首先要解决的问题就是对象创建,即在原本创建外部对象的地方创建 Mock
Objects,因此在设计、实现业务逻辑时需要注意从业务逻辑中分离出对象创建逻辑。
Factory Method
是一种被普遍运用的创建型模式,用于将对象创建的职责分离到独立的方法中,并通过子类化来实现创建不同对象的目的。如果被测试单元所使用的外部对象是通过 Factory
Method 创建的,则可以通过从已有被测试的 Factory 类派生出一个新的 MockFactory,以创建 Mock Objects,并在 setUp
测试中创建 MockFactory,从而间接达到对被测试类进行测试的目的。
下面的代码片段展示了具体的做法:
以下则是对应的 MockOuterObjects、MockFactory 以及单元测试的实现:
本文转自IBM Developerworks中国
请点击此处查看全文
设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述,通过在系统设计中引入合适的设计模式可以为系统实现提供更大的灵活性,从而有效地控制变化,更好地应对需求变更或者按需变更系统运行路径等问题。
|
Fix 或功能扩展时,能很好地保证已有实现不会遭到破坏,从而使得程序更易于维护和修改。 Martin Fowler、Kent Beck、Robert
Martin 等软件设计领域泰斗更是极力倡导测试先行的测试驱动开发(Test Driven Development,TDD)的开发方式。
单元测试主要用于测试细粒度的程序单元,如类的某个复杂方法的正确性,也可以根据需要综合测试某个操作所涉及的多个相互联系的类的正确性。在很多情况下,相互联系的多个类中有些类比较简单,为这些简单类单独编写单元测试用例往往不如将它们与使用它们的类一起进行测试有意义。
模拟对象(Mock
Objects)是为模拟被测试单元所使用的外围对象、设备(后文统一简称为外部对象)而设计的一种特殊对象,它们具有与外部对象相同的接口,但实现往往比较简单,可以根据测试的场景进行定制。由于单元测试不是系统测试,方便、快速地被执行是单元测试的一个基本要求,直接使用外部对象往往需要经过复杂的系统配置,并且容易出现与欲测试功能无关的问题;对于一些异常的场景,直接使用外部对象可能难以构造,而通过设计合适的
Mock Objects,则可以方便地模拟需要的场景,从而为单元测试的顺利执行提供有效的支持。
本文根据笔者经验,介绍了几种典型的设计模式在系统设计中的应用,及由此为编写单元测试带来的方便。
从对象创建开始
由于需要使用 Mock Objects 来模拟外部对象的功能,因此必须修改正常的程序流程,使得被测试功能模块与 Mock
Objects,而不是外部对象进行交互。要做到这一点,首先要解决的问题就是对象创建,即在原本创建外部对象的地方创建 Mock
Objects,因此在设计、实现业务逻辑时需要注意从业务逻辑中分离出对象创建逻辑。
|
是一种被普遍运用的创建型模式,用于将对象创建的职责分离到独立的方法中,并通过子类化来实现创建不同对象的目的。如果被测试单元所使用的外部对象是通过 Factory
Method 创建的,则可以通过从已有被测试的 Factory 类派生出一个新的 MockFactory,以创建 Mock Objects,并在 setUp
测试中创建 MockFactory,从而间接达到对被测试类进行测试的目的。
下面的代码片段展示了具体的做法:
// BaseObjects.java package com.factorymethod.demo; public interface BaseObjects { voidfunc(); } // OuterObjects.java package com.factorymethod.demo; public class OuterObjects implements BaseObjects { public void func() { System.out.println("OuterObjects.func"); } } // LogicToBeTested.java, code to be tested package com.factorymethod.demo; public class LogicToBeTested { public void doSomething() { BaseObjects b = createBase(); b.func(); } public BaseObjects createBase() { return newOuterObjects(); } } |
本文转自IBM Developerworks中国
请点击此处查看全文
相关文章推荐
- 如何编写优雅的代码:07. 设计模式应用案例(下)
- 如何编写优雅的代码:06. 设计模式应用案例(上)
- 设计模式用过哪些,应用场景是什么;单例模式有几种实现方式,代码怎么写?
- 145 php 设计模式代码和应用场景实例
- 如何编写优雅的代码:04. 设计模式(中)
- 如何编写优雅的代码:03. 设计模式(上)
- 编写高质量代码-OC 第7章 设计模式与Cocoa编程
- 单元测试和设计模式在重构中的应用
- 利用C#实现游戏应用设计模式(编写周期2天)
- 如何编写优雅的代码:05. 设计模式(下)
- 项目管理大法归档 - 思维导图、原型工具、接口测试、设计模式、版本管理、单元测试、持续集成、代码审查、Bug 跟踪
- DAO设计模式代码编写步骤
- 面试中临时让写的代码——编写一个延迟加载的单例设计模式
- 《从零开始学Swift》学习笔记(Day 68)——Cocoa Touch设计模式及应用之响应者链与触摸事件
- Java常见设计模式应用场景
- 设计模式讲解与代码实践(四)——原型
- 建造者模式--介绍、应用及代码
- 编写易于理解代码的六种方式
- 代理设计模式在 UIScrollView 中的应用
- Comamnd模式和Factory模式在一次代码重构中的应用