没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Junit 中的设计模式
Junit 源码解析
10/1
JUnit 设计模式分析
摘要
JUnit 是一个优秀的Java单元测试框架,由两位世界级软件大师Erich Gamma 和 Kent Beck 共同开发完成
。本文将向读者介绍在开发 JUnit 的过程中是怎样应用设计模式的。
关键词:单元测试
JUnit 设计模式
1
JUnit 概述
JUnit 概述
JUnit 是一个开源的 java 测试框架,它是 XUnit 测试体系架构的一种实现。在 JUnit 单元
测试框架的设计时,设定了三个总体目标,第一个是简化测试的编写,这种简化包括测试框
架的学习和实际测试单元的编写;第二个是使测试单元保持持久性;第三个则是可以利用既
有的测试来编写相关的测试。所以这些目的也是为什么使用模式的根本原因。
JUnit 开发者
JUnit 最初由Erich Gamma 和 Kent Beck 所开发。Erich Gamma 博士是瑞士苏伊士国际
面向对象技术软件中心的技术主管,也是巨著《设计模式》的四作者之一。Kent Beck 先生
是 XP(Extreme Programming)的创始人,他倡导软件开发的模式定义,CRC 卡片在软件开
发过程中的使用,基于 XUnit 的测试框架,重新评估了在软件开发过程中测试优先的编程模
式。是《The Smalltalk Best Practice Patterns》、《Extreme Programming Explained》和《Planning
Extreme Programming(与 Martin Fowler 合著)》的作者。
由于 JUnit 是两位世界级大师的作品,所以值得大家细细品味,现在就把 JUnit 中使用
的设计模式总结出来与大家分享。将按照问题的提出,模式的选择,具体实现,使用效果这
种过程展示如何将模式应用于 JUnit。
2
JUnit 体系架构
JUnit 的设计使用以Patterns Generate Architecture(s
请参见"Patterns Generate Architectures",
Kent Beck and Ralph Johnson, ECOOP 94)的方式来架构系统。其设计思想是通过从零开始
来应用设计模式,然后一个接一个,直至你获得最终合适的系统架构。
Junit 中的设计模式
Junit 源码解析
10/2
3
JUnit 设计模式
Command(命令)模式
问题
JUnit 是一个测试 framework,测试人员只需开发测试用例。然后把这些测试用例(TestCase)组
成请求(可能是一个或者多个),发送到 JUnit,然后由 JUnit 执行,最后报告详细测试结果。其
中包括执行的时间,错误方法,错误位置等。这样测试用例的开发人员就不需知道 JUnit内
部的细节,只要符合它定义的请求格式即可。从 JUnit 的角度考虑,它并不需要知道请求
TestCase 的具体操作信息,仅把它当作一种命令来执行,然后把执行测试结果发给测试人员。这
样就使 JUnit 框架和 TestCase 的开发人员独立开来,使得请求的一方不必知道接收请求一方的
详细信息,更不必知道是怎样被接收,以及怎样被执行的,实现系统的松耦合。
模式的选择
Command(命令)模式(请参见 Gamma, E., et al. Design Patterns: Elements of Reusable
Object-Oriented Software, Addison-Wesley, Reading, MA, 1995)则能够比较好地满足需求。摘
引其意图(intent),
"
将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参
数化;对请求进行排队或记录请求日志..."Command 模式告诉我们可以为一个操作生成一个
对象并给出它的一个"execute(执行)"方法。
实现
为了实现 Command 模式,首先定义了一个接口 Test,其中 Run 便是 Command 的 Execute
方法。然后又使用 Default Adapter 模式为这个接口提供缺省实现的抽象类 TestCase,这样开
发人员就可以从这个缺省实现进行继承,而不必从 Test 接口直接实现。
Test
run()
TestCase
run()
我们首先来分析 Test 接口,它有一个 countTestCases 方法,用来统计这次测试有多少个
Te
stCase
,另外一个方法就是 Command 模式的 Excecute
方法,这里命名为 r u n ,参数 TestResult
用来统计测试结果
public interface Test {
// Counts the number of test cases that will be run by this test.
public abstract int countTestCases();
//runs a test and collects its result in a TestResult instance.
public abstract void run(TestResult result);
Junit 中的设计模式
Junit 源码解析
10/3
}
TestCase 是该接口的抽象实现,它增加了一个测试名称属性,因为每一个 TestCase 在创建时
都要有一个名称,如果一个测试失败了,便可识别出是哪个测试失败。
public abstract class TestCase extends Assert implements Test {
//the name of the test case
private String fName;
public void run(TestResult result) {
result.run(this);
}
}
这样测试人员,编写测试用例时,只需继承 TestCase,来完成 run 方法即可,然后 JUnit 获
得测试用例的请求,执行它的 run 方法,把测试结果记录在 TestResult 之中,目前可以暂且
这样理解。
效果
下面来考虑经过使用 Command 模式后给系统的架构带来了那些效果:
Command 模式将实现请求的一方(TestCase 开发)和调用一方(JUnit )进行解藕
Command 模式使新的 TestCase 很容易加入,无需改变已有的类,只需继承 TestCase 类
即可,这样方便了测试人员
Command 模式可以将多个 TestCase 进行组合成一个复合命令,你将看到 TestSuit 就是
它的复合命令,当然它使用了 Composite 模式
Command 模式容易把请求的 TestCase 组合成请求队列,这样使接收请求的一方(Junit
Fromwork),容易决定是否执行请求,一旦发现测试用例失败或者错误可以立刻停止进
行报告
Command 模式可以在需要的情况下,方便实现对请求的 Undo 和 Redo,以及记录 Log,
这部分目前在 JUnit 中还没有实现,将来是很容易加入的
Composite(组合)
问题
为了获得对系统测试的信心,需要运行多个测试用例。通过使用 Command 模式,JUnit
能够方便的运行一个单独的测试用例之后产生测试结果。可是在实际的测试过程中,需要把
多个测试用例进行组合成为一个复合的测试用例,当作一个请求发送给 JUnit.这样 JUnit 就
会面临一个问题,必须考虑测试请求的类型,是一个单一的 TestCase 还是一个复合的
TestCase,甚至要区分到底有多少个 TestCase。这样 Junit 框架就要完成像下面这样的代码:
if(isSingleTestCase(objectRequest)){
//如果是单个的 TestCase,执行 run,获得测试结果
(TestCase)objectRequest.run()
}else if(isCompositeTestCase(objectRequest)){
//如果是一个复合 TestCase,就要执行不同的操作,然后进行复杂的算法进行分
//解,之后再运行每一个 TestCase,最后获得测试结果,同时又要考虑
//如果中间测试出现错误怎么办????、
剩余15页未读,继续阅读
资源评论
小小哭包
- 粉丝: 1900
- 资源: 3864
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功