asc jtester 分享

37
ASC JTESTER 分分 吴吴吴 2010-11-07

Upload: levia

Post on 21-Jan-2016

99 views

Category:

Documents


0 download

DESCRIPTION

吴大瑞 2010-11-07. ASC JTESTER 分享. 大纲. 整体框架介绍 断言模块 Spring 模块 DbFit 模块 问题解答 Q&A. 整体框架介绍. dbFit module. Spring module. Inject module. Junit / TestNG. jTester. jmockit. tracer module. Jtester assert. 整体框架介绍. 框架中的观察者模式. 每个生命周期都是一个观察点。 每个模块都有一个监听器。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: ASC   JTESTER   分享

ASC JTESTER 分享

吴大瑞2010-11-07

Page 2: ASC   JTESTER   分享

大纲• 整体框架介绍• 断言模块• Spring 模块• DbFit 模块• 问题解答• Q&A

Page 3: ASC   JTESTER   分享

整体框架介绍

Junit / TestNGjTester

Spring module

dbFit module

Inject module

tracer modulejmockit

Jtester assert

Page 5: ASC   JTESTER   分享

框架中的观察者模式• 每个生命周期都是一个观察点。• 每个模块都有一个监听器。• 注册方式: unitils.modules=database,dbfit,jmock,inject,spring,tracer

• 当框架执行到每个生命周期时,会通知各个模块执行对应的动作。

Page 6: ASC   JTESTER   分享

Spring 模块的监听器

• 在测试类创建后注册 mock bean 对象 .• 老版本 @MockBean• 新版本 @SpringBeanFor

• 在每个测试方法开始前• 初始化 spring 容器(只有第一个方法做)• 根据 Annotation 注入相应的 spring bean 。( @SpringBeanByName

@SpringBeanByType @SpringBean @SpringBeanFor )

Page 7: ASC   JTESTER   分享

DbFit 模块的监听器

• 每个测试方法前,注册 wiki 变量;查找要运行的 wiki 文件。

• 每个测试方法后,注册 wiki 变量;查找要运行的 wiki 文件;清除 wiki 变量。

Page 8: ASC   JTESTER   分享

其他模块的监听器• 数据库管理监听器。

• Inject 模块监听器。

• Spring bean 堆栈和 SQL log 记录监听器。

Page 9: ASC   JTESTER   分享

jTester 中的断言

对 java assert 的思考?

Page 10: ASC   JTESTER   分享

Java Assert 的 2 种用法• assert <boolean 表达式 > 如果 <boolean 表达式 > 为 true ,则程序继续执行。 如果为 false ,则程序抛出 AssertionError ,并终止

执行。

• assert <boolean 表达式 > : < 错误信息表达式 > 如果 <boolean 表达式 > 为 true ,则程序继续执行。 如果为 false ,则程序抛出 java.lang.AssertionError ,

并输入 < 错误信息表达式 > 。

jTester 的断言本质上就是 java 的assert 断言。凡是 jTester 断言可以做的事情, java assert 都可以做,

无非是提供了便利性。

Page 11: ASC   JTESTER   分享

即时生效的断言• want.type( 你要断言的值 ).assert( 你希望这

些值拥有哪些的性质 ?)

• 举例:

这条语句是立即判断 alibabaAddress 这个对象的性质的,任何一个性质的不符合都将抛出 AssertionError ,终止测试的运行。

Page 12: ASC   JTESTER   分享

延后生效的断言• the.type().assert( 你希望这些值拥有哪些的

性质 ?) 注意:这里并没有传你的期望值进去。只是描述了你的期望值要有的性质。

• 举例 :

定义断言器的时候并没有发生真正的 assert 行为,只有到程序中调用到 mock api是才发生断言。

Page 13: ASC   JTESTER   分享

jTester 断言的结构分析

• matche 判断实际值是否符合性质( item ) 对于即时生效的断言是马上运行的。 对于延后生效的断言是允许到对应的 api 时才触发。

• describeMismatch 如果不符合,返回给用户的错误信息的描述。

Page 14: ASC   JTESTER   分享

jTester 断言的结构分析Hamcrest

Contains StartsWith …… UnitilsPropertyMatcher

Page 15: ASC   JTESTER   分享

几个复杂对象判断的示例• 判断 pojo 对象的属性。• 判断 pojo 对象集合。• 判断 map 对象。

Page 16: ASC   JTESTER   分享

SpringModule 解析• @SpringApplicationContext

加上这个属性, spring 加载将会忽略不存在的

bean ,提高测试的健壮性

Page 17: ASC   JTESTER   分享

• @SpringBeanByName• @SpringBeanByType• @SpringBean(value=“bean name”)

到目前为止, spring bean 的注入是单向的。即框架启动 spring 容器,初始化好 spring bean ,然后根据@SpringBeanByName 等标注将对应的 bean 从容器

中取出,注入到 testcase 中。

SpringModule 解析jTester 根据 TestCase

@SpringApplicationContext 内容

初始化 spring 容器

Spring 容器

jTester 框架从 spring 容器中将对应的bean 取出来注入到 TestCase 中

Page 18: ASC   JTESTER   分享

SpringModule 解析• @AutoBeanInject 定义了基本的公用的 spring bean

此时 phoneBookService 等bean 在 spring 容器中并没有定义。

jTester 框架根据@SpringBeanByName 等标注和规则,在 spring 容器初始化前定义对应字段的 bean 定义。

AutoBeanInject 定义了查找bean 实现类的规则

jTester 框架初始化 spring 容器

jTester 框架从 spring 容器中将对应 bean 取出注入到 TestCase 中。

现在, @SpringBeanByName 等作用是双向的。1 、往 spring 容器中定义 bean 。2 、从 spring 容器中取出 bean 。

Page 19: ASC   JTESTER   分享

@AutoBeanInject 的说明

是否启动自动注入(提供一个开关, disabled 自动注入)自动注入的规则 @BeanMap 数组

例子规则说明:

这里 ** 表示 package 的一部分, * 表示 classname 的一部分。第一个BeanMap 规则表示,接口类的package + “.impl” 是实现类的package ,第二个 BeanMap 表示实现类的 package 就是接口类的package 。二个规则中:接口类的 classname + “Impl” 就是实现类的 classname 。

可以有任意个 ** 和 * ,但要是可分割的。比如intf = **.intf.**.*Intf* impl = **.impl.**.*Impl.*

根据依赖字段的属性名称或者字段类型的 package ,显式的排除依赖的查找。

是否忽略根据规则查找不到的属性依赖。False :如果查找不到属性依赖,抛出错误。True :如果查找不到属性依赖,打印一条消息,继续。

Page 20: ASC   JTESTER   分享

如果我有一个实现类 adfa.dadf.edd.ImdOll

和接口类eiu.e384d.adf.IntfId

之间根本毫无规则可言怎么办?

Page 21: ASC   JTESTER   分享

@SpringBeanFor 的作用

@SpringBeanFor(MyImplement.class)MyInterface myInterface;

@SpringBeanForMyInterface myInterface = new MyImplement();

都是定义了 MyInterface的实现是 MyImplement ,它们有区别吗?jTester 框架会继续查找MyImplement 类中定义的属性的 bean 定义。

jTester 把 new MyImpelment() 作为 bean 对象,不在查找其属性依赖。

引申:@SpringBeanFor@MockedMyInterface myInterface;

Page 22: ASC   JTESTER   分享

jTester 在 Spring 加载过程中做了哪些手脚?

Page 23: ASC   JTESTER   分享

Inject 模块解析• Targets 表示要将

字段值注入到那些对象中。

• Properties 表示字段值注入到 target对象的那个属性中,如果为空,则默认按字段名称注入。

Page 24: ASC   JTESTER   分享

Inject 模块解析• 示例

Page 25: ASC   JTESTER   分享

DbFit 模块解析• Wiki格式 |…|…|• 基于表格驱动• 以 html 方式呈现结果

• @DbFit(when=“”,then=“”)

Wiki 数据

Html格式

HTML 表格中数据驱动

Html 结果呈现

Page 26: ASC   JTESTER   分享

DbFit 模块解析• 容易犯的错误

表格格式不全|data|data|data

表格错位|Insert|table_name||field1|field2||value1|value2||commit|

没有 connect|connect|

Page 27: ASC   JTESTER   分享

DbFit 模块解析• DbFit wiki 文件中可使用的命令基本上都定

义在 DatabaseFixture 这类中。

Page 28: ASC   JTESTER   分享

在 DbFit 中使用变量

Page 29: ASC   JTESTER   分享

在 DbFit 中使用变量• 动态使用变量

• 内置变量 @{date} 当前日期 yyyy-MM-dd

@{datetime} 当前时间 yyyy-MM-dd HH:mm:SS @{space} 空格

Page 30: ASC   JTESTER   分享

自动查找 wiki 文件

Page 31: ASC   JTESTER   分享

jTester 中的事务• DatabaseModule.Transactional.value.default=commit

• @Transactional(TransactionMode.ROLLBACK)

• 在 DbFit 的 wiki 文件中显式的 |commit| 或 |rollback|

• api 中抛出了 Spring 事务定义中回滚的异常。 此时,在 test 结束 commit 或 rollback 都会导致测试错误,解决办法。

TransactionMode.DISABLED

Page 32: ASC   JTESTER   分享

Mock 的技术原理• Java Proxy : java 提供的接口代理机制。• Asm 、 cglib 的作用:在 classloader 的时候静态改变 class 的字节码。

• JDK5 java agent : class loader 的时候动态修改 class 的行为。

• JDK6 java agent :可以做到 class loader 后动态改变 class 的行为。

Page 33: ASC   JTESTER   分享

Mock 的使用• 工具类 DateUtil

Page 34: ASC   JTESTER   分享

Mock 的使用• 问题:私有方法的 mock• 关键: new MockUp<T>针对的是 class 实现

,因此这种方式无法 mock 接口。如果一个方法是在父类中定义的,那么应 mock父类,而不是子类。

• 所有的 mock 方法的限定词都是 public ,而不管原方法是 private, public, static还是final.

Page 35: ASC   JTESTER   分享

Mock 的使用• 基于行为的测试

– @Mocked / @NonStrict– new Expectations() / new NonStrictExpectations()

• 为什么我已经 mock 了这个接口调用到还会报错?

• 为什么我没有调用到这个接口也会报错?

Page 36: ASC   JTESTER   分享

Mock 的使用• 参照官方文档

http://code.google.com/p/jmockit/

• jTester 文档及 ppt

Page 37: ASC   JTESTER   分享

Q & A