当单元测试遇到框架

上一篇 / 下一篇  2010-02-21 14:37:06 / 个人分类:单元测试

51Testing软件测试网"\e;c0Y2P-_K

  为什么要写这篇文章

])gU6IyK051Testing软件测试网.BQz*^|1^$t%YK

  想总结一下我们的TDD作法。正在看《JUnit in Action》,从中得到了不少经验和做事情的正确方法,并不断地修正了自己的一些错误的做法。某些问题我想知道大家的解决方案,看看大家有什么好的或者成熟的方案。

1IV ] `KYMv0

TnIoh|5o)lq2JZ0  领域层51Testing软件测试网/Ps5a _$X#e

51Testing软件测试网5w4N5dTg I PiP

  起初我们使用TDD的时候,从领域模型开始,两个人先在纸上画出领域模型的草图,写上一些显而易见的方法,然后打开Eclipse开始写JUnit单元测试,Eclipse 对于TDD的支持很好,我们按照特性描述(就算是User Story吧),开始创建每个对象,当然会抱错,然后使用Eclipse自动创建那个类,我们会根据需求加入责任,然后自动生成method stub。我们花了两个小时创建了6个对象,完成了一个特性。当然,对于领域层的测试,这一切都很正常。

p5X0s.T \K(NIwyC051Testing软件测试网BR6gtYzl

  然后我们引入了Springframework,我们先设计一些接口,然后在Spring的配置文件中映射好实现这些接口的对象,然后我们在测试用例中写上spring初始化bean的代码:

pN.NKB7x n$E;S0

TA/V-a9EH,W z0

51Testing软件测试网O'j_G X b;y(|

java 代码

Z#\mca[#sK G`0

^mm^6ZO*`0E%\01. ApplicationContext ctx = new ClassPathXmlApplicationContext( new String[] { "applicationContext.xml" });

}cuMC#@r7cF v.voMD051Testing软件测试网1x R&T#K p)b&I1n

2. service=(BussinessFacade) ctx.getBean("service");

6eP3] vO1r:jH0

Z0J,L&\x7| _051Testing软件测试网^9cjP2_@7RX7Xt

  我们在每一个测试方法里都写,后来知道应该把这样的代码放到setUp中。我又开始使用Spring的测试框架,但是这样运行单元测试实在是太慢了!后来,知道了测试领域层的时候不要混入框架,创建对象直接用new就好。51Testing软件测试网/c ET2O Kv^ eM,` v

7ng)S0U/t0  表现层51Testing软件测试网-w-P u.[y Z

51Testing软件测试网];H.IVx

  我来继续观察表现层,其中包括Struts Action作为控制器的控制层,和Ext+HTML的UI。UI已经是一个独立的“系统”了,唯一和它联系的就是Action了。Action的作用是接收Http Request,读取参数,调用业务门面,拼接并返回Ext需要读取的数据源(XML或JSon)。我们采取的Struts和Spring的整合策略是将 Action托管给Spring。这样,如果想要测试Action:

7M2K^8U.oCU:rB7eeWl0

;]EJ5@]&]0  1、和Spring框架一起来测试

H1?&g?(s051Testing软件测试网 `eVI,YkA

  2、Action中的逻辑很简单,(其实Facade中封装了领域对象的协作,也可看作一种控制器)测试的目的是:51Testing软件测试网#VW4]!Y/K%C&]

51Testing软件测试网f~,E!??

  1)看看参数传过来没有51Testing软件测试网Vc |0QRB

51Testing软件测试网r-wQ#@7N5v2n(p1p~y

  2)领域模型是不是返回了正确的值

o]$KbI?051Testing软件测试网*{)uG}5L9R-X

  3)XML或JSon的返回串拼接的是否正确。51Testing软件测试网j5{$\ r k7ITf

51Testing软件测试网 ]0}fyS

  4)还有更基础的是测试一下Struts和Spring的配置文件写的对不对。

Nj,J3@!|0

8K u+bRZ$mK0  3、实际上返回的领域对象只是Mock Object。

"] Hnn'A.e051Testing软件测试网+Y3Z!\o;s!s}.?

  我们的测试很原始,还没有使用过StrutsActionTest这样的框架,只是直接使用Tomcat来测试(不过已经比直接使用WebLogic容易多了)。51Testing软件测试网 [wf"H~!U\

51Testing软件测试网uA d1`M3ss d

  速度很慢,每次都要初始化那些XML配置文件,而且还要读根本用不上的Hibernate的配置文件。

y5A3YUU6M,xV)c t051Testing软件测试网9Z-~!L0a{L`

  关于Hibernate配置文件的问题是这样的:51Testing软件测试网BRl_V]wM

xml 代码
X\9c|-Is*`A _051Testing软件测试网"w&oCq"}8wS
   1. <bean id="sessionFactory"
&Gl7`2M0Nk0   2.     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">51Testing软件测试网W:r}(rN`ns'L(U
   3.     <property name="configLocation">51Testing软件测试网"b(O|$gY(]
   4.         <!-- <value>WEB-INF\classes\Account-Hibernate.cfg.xml</value>-->51Testing软件测试网TV(B*kg'C
   5.           <value>Account-Hibernate.cfg.xml</value>   
8`@ K5J%oH0   6.     </property>51Testing软件测试网#G^o J-B2E
   7. </bean> 
2|{W sW2}RR0
51Testing软件测试网 OMo9r.S}"b A

  我们不得不在进行DAO测试时,使用没有注释掉的value来读取cfg.xml。而在测试Action时,又需要使用注释掉的配置。
5U1M5]l8n0UZm0
o/a/tCA7W0  我觉得或许采用下面的策略能好些,不过不知道各位在自己的项目中都是如何做的:
-p'e7JH-e1A m.c)?051Testing软件测试网VLc(Vp th
  测试表现层时用专为测试这一层的Spring配置文件(我们采用了org.springframework.web.context.ContextLoaderListener这种方式),避免和Hibernate配置文件挂上联系。51Testing软件测试网"x.U,MQ bk9|[

q.JDs8e.oxm9h0  持久层
#s1rq{z5V%L)W$O0
jLEM ~ b@ x@0  采用DAO模式,我们的DAO很简单,就是直接调用Spring的getHibernateTemplate的方法,于是测试的时候关键就是测试:51Testing软件测试网zp8@\`N*\

*C:s([X0sVd5l0  1、HQL语句是否书写正确,SQL语句是否生成正确51Testing软件测试网9w vd7KR#z l-TC

.f A;X&C\!f0  2、Hibernate映射是否写的正确51Testing软件测试网2VcFUa0jMG!]
51Testing软件测试网4tZ#lX1z'Vq.K%V ~SE
  3、Sping和Hibernate基础设施是否配置正确
F5E B|"WbG051Testing软件测试网u(m6o:Ke pN_
  4、是否按照预期完成CRUD操作。51Testing软件测试网.Vnx/W @~ Bl
51Testing软件测试网!J3yk*G)be
  测试一个DAO需要耗时2秒,而不是0.12秒。不过如果基于上面的目的进行测试也无可厚非。

6E$^@,q,w+Fn]4r3@y-rlE0

cD{ V7[eOo+|0  单元测试真的是这样做的吗?51Testing软件测试网C]6Jm)|u
51Testing软件测试网S.mA5q*?c"}Ig3E
  按《JUnit in Action》上的说法,单元测试还包括集成单元测试,功能单元测试。51Testing软件测试网:INKzkV$U P

'lQ'a6\ |0  所以看上去,在DAO层和控制层测试时是绑定了框架一起进行测试是有道理的,可以称之为集成单元测试。那么我还是有以下疑问:
F d-M]q5K@:j051Testing软件测试网~ n:CBw+ud
  1、这样做是正确的吗?大家都是怎么做的?
A8LW Yw6]051Testing软件测试网m}1d@b+le4a
  2、持续集成中运行单元测试包不包括这部分集成单元测试呢?还是仅包含测试业务逻辑的领域层测试
X8RP TN&r n051Testing软件测试网C1co z0ma$V,ZZ
  3、对于报表驱动的业务系统(类似于Kent他们第一次使用XP时做的那个系统),这样做正确吗?不过我们的业务也很复杂。
&j Z,N[9@A-T0

h$n|-A)K;[6v051Testing软件测试网Uw5m9v{x

1R;p0a#c,VAS0

TAG:

 

评分:0

我来说两句

Open Toolbar