??xml version="1.0" encoding="utf-8" standalone="yes"?>
作者:(x)陈市?/span>/Slipper Feng 摘自Qhttp://www.aygfsteel.com/JPeanut
现在来多的系l不是独立运行的Q会(x)和其他系l进行交互。交互的方式又很多,从传l的面 post 到现在的 jms Q?/span> ws {。这个就l测试带来比较大的难度,特别是互盔R讯的系l不属于同一个公司。测试h员很隑֜一个办公室里面q行寚w目完整的试Q更何况Ҏ(gu)pȝ有的时候是没有试组的,只有开发h员兼职做试?/span>
我这里主要是解决 jms 通讯的单元测试。在我们公司Q?/span> jms 的传输的数据密文传输Q因为历史原因被UCؓ(f)甉|Q。很多情况下我们都是通过 mock 来模拟队列和甉|的,我这里是通过重新?/span> jms ?/span> mq ?/span> jms ?/span> message 来实现的Q所有的数据不是通过模拟的东西,而是q入真实的队列中?/span>
设计思想Q?/span>
模拟 MQ ?/span> JMS 的工作原理,~写一个本地的 MQ 和消息发送接收系l?/span>
在内存中直接替?/span> aop 容器中的 MQ ?/span> JMS 替换为本地的 MQ 和我们的消息处理
具体设计Q?/span>
1 Q电(sh)文接?/span>
图表 1 新电(sh)文系l接收电(sh)文原?/span>
新电(sh)文接收系l:(x)其他pȝ如果要发送信息给我们的系l,是先讲电(sh)文发送给我们?/span> uecp q_Q然?/span> uecp 讲电(sh)文存攑ր?/span> MQ 中,我们目对从 MQ 中读出电(sh)文,然后Ҏ(gu)配据配置调用响应?/span> Service Q最后,一般情况, service 都是来操作数据库q行增删改动作?/span>
新电(sh)文^台的几大特点Q?/span>
Ø 甉|是异步传?/span>
Ø 甉|的是有时序的
Ø 一般来_(d)一个应用只有一个电(sh)文接攉?/span>
图表 2 新电(sh)文接收的单元试原理
针对新电(sh)文系l接收的原理和特点,可以分析出:(x)
Ø 甉|必须Ҏ(gu)本地的的Q单元测试做不到异步甉|的自动化回归
Ø 应用只有一个队列,我们只需要封装下 ArrayList 可以作为队列了
Ø Z修改最话Q?/span> IBMMQProxy 的实现改?/span> JunitMessagingServerProxy Q然后,再通过 ioc 注入 junit ?/span> MQ ?/span> Junit ?/span> JMS
Ø 因ؓ(f)?/span> uecp 中可以看到电(sh)文的明文的,所以, Test***Action 发送电(sh)文也是明码,可以直接?/span> uecp 中的甉| copy 到程序中
图表3新电(sh)文系l发送电(sh)文原?/span>
新电(sh)文发送系l:(x)我们的系l如果对其他多个pȝq行交互Q会(x)对几个队列分别发送数据,uecpdq些队列数据准发送到各个pȝ中?br />图表4新电(sh)文发送的单元试原理
新电(sh)文发送的单元试原理比较单,是Test×××Action调用?x)引起发送电(sh)文的代码Q等q行完,去查看队列里面是不是我们预期发送的甉|?br />
作者:(x)陈市?/span>/Slipper Feng 摘自Qhttp://www.aygfsteel.com/JPeanut
Junit 目前?/span> java U最为流行的单元试的框Ӟ开发h员是~写设计模式的三大牛Z一?/span> junit 灉|的用了多种模式Q得扩展非怹Ҏ(gu)。他的扩展是所有单元测试框架是最多的Q但是很多扩展都是直接承自 TestCase Q这个就D用了q个扩展没法用其他的扩展了,比如Q用?/span> dbunit ׃能再?/span> easy struts 了(除非Q我们对扩展q行重写Q?/span>
Z解决q个问题Q我?/span>Junit之上q封装了一?/span>TestFrameQ?/span>junit能够很容易的同时使用多个扩展。我们这里的设计思想是:(x)
1Q?span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> 把扩展写成插件式Q我只要通过写一?/span> plugin 接口让他集成q我们的框架?/span>
2Q?span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> 后期Ҏ(gu)构的功能扩展完全可以通过插g实现。目前,已经写了 dbunit Q?/span> struts-easy,imon fk Q?/span> JMS 甉|?/span> plugin 。通过插g的方式,我们可以很Ҏ(gu)的解?/span> junit 的硬伤:(x)试数据代码?/span>
3Q?span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> 插g的添加,无需修改架构?qing)其原有的测试脚本,只需要在“项目的 TC ”中在注册中心对插g注册可以获得插件的所有的功能
4Q?span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> 架构是面向对目的,所有不同架构的目可以使用同一套底层架构,不一L(fng)只是“项?/span> Tc ?/span>
5Q?span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"> Test Frame Work 、所有的 plugin 和项?/span> TC 都可以各自独立打?/span> jar Q这h架可以很方便的进行局部升U?/span>
Q呵呵,有了甉|插g后,很Ҏ(gu)的对我们的项目进行自动化的单元测试。在ơ之前,我们一直没有对甉|q行有效的自动化的单元测试, mock 技术可以实玎ͼ但是Q对于需求变?/span> mock 没有很好的解军_法)
作者:(x)陈市?/span>/Slipper Feng 摘自Qhttp://www.aygfsteel.com/JPeanut
J2EE 是目前公认的比较慢的一U开发,相比 .net Q?/span> php Q?/span> asp {而言。其实, j2ee 的开发者都深有体会(x)的, java 代码~写的速度其实q不慢,?/span> eclipse ?/span> jbuilder {可视化界面的帮助下Q编写代码变的越来越单;但是在调试的时候,每改完一?/span> java 或?/span> xml 代码要预览改的效果的话,必须要重新构建,部vQ重启服务器 , q些动作反反复复Q消耗的旉不少?/span>
q期为公司写了个单元试的框Ӟ基本上解决了反反复复构徏Q部|Ԍ重启服务器的问题。我们的目的都是运用了cM struts Q?/span> spring Q?/span> hibernate ?/span> MVC 架构Q下面简U?/span> ssh Q,不同的就是中间的 aop 是自己开发实现的Q而没有运?/span> spring 的。不q,我们的单元测试框架对标准?/span> struts Q?/span> spring Q?/span> hibernate 支持也挺好?/span>
上面的是?/span> ssh 的一ơ交互的原理图,做过 struts 开发者都?x)很熟(zhn)。首先,?/span> jsp 通过 submit ?/span> url 表单数据提交给后台 action ?/span> servlet Q后台通过?/span> struts-config.xml 中的配置扑ֈ相关的××?/span> Action Q然后通过××× Service Q××?/span> Dao 操作数据库,再将数据q回l另外一?/span> jsp Q让他显C结果?/span>
上面的图是我们单元测试框架实现构建,部vQ重启服务器的原理图。我们很Ҏ(gu)从图上看的出来,我们写了?/span> Test ××× Action 来模?/span> 2 ?/span> jsp 的动作,该类分成 2 部分上面一部分是模拟了 jsp 面 submit 的动作(包括模拟提交l?/span> url Q模拟提交数据)Q下面一部分是接收××?/span> Action q回的数据,然后Q进行校验(此处的校验,我们用了 junit 的断a功能Q。通过?/span> java cL模拟 jsp 的好处在于,我们可以完全把这个一个交互作Z?/span> application 来运行v来,非常Ҏ(gu)的做到单步调试,而不用到真实的^CQ启动服务器上运行。(注:(x)此处?/span> 2 ?/span> db Q开?/span> db 和测?/span> db Q这个再以后的介l中?x)讲刎ͼ?/span>
我们qؓ(f)在这个架构上开发制定了程Q?/span>
1 把当天需要开发的模块?/span> java 代码全部些好
2 通过q种模式调试 java 代码
3 在确保这?/span> java 代码无误后,构徏Q部|Ԍ启动服务?/span>
4 然后~写所有的 jsp Q因Z?/span> jsp 无需启动服务器)
q样Q在开发一天的所有代码,几乎都不用怎么重启服务器,可以为开发h员省下很多时_(d)也得开发h员喜Ƣ的单步调试变的异常单,提高代码的质量?/span>
我们已经在真实的目中实施了该流E的开发,得到的效果和预期的一栗当然还是比不过其他语言的开发,不过我们的架构还在不断改q(通过改进程、编?/span> eclipse {开发工L(fng)插g{方法)Q我们的开发h员可以更加快的进?/span> j2ee 的开发?/span>
作者:(x)陈市?/span>/Slipper Feng 摘自Qhttp://www.aygfsteel.com/JPeanut
q入似组也有不少旉了,很多旉都?/span> 51testing 论坛里,混在“测试时代组”的 qq 里Q和做测试的朋友聊,聊久了就产生了很多想法。呵呵,x变成现实嘛,改不了开发的老本行,l合我们公司的开发流E现Ӟ自己动手写了一套关于测试架构,方便我们试和开发?/span>
该架构主要有实现了一下几点功能:(x)
1 调试无需启动中间?/span>
2 数据和测试代码部分隔?/span>
3 自动生成试文档
4 单元试实现功能试
5 实现回归试自动?/span>
6 。。。。?/span>
在后面的一些时_(d)我会(x)陆箋详细的从各个角度来介l这个架构,架构也还在陆l开发和改进中?/span>