当单元测试遇到框架(转:来自javaeye 作者:sslaowan)

原创 2007年10月12日 14:23:00
下面我按照我们的分层架构来说说我们的分层测试,看到这里也有讨论DAO测试的,讨论分层测试的,不过很多帖子都已经不能回复了。

为什么要写这篇文章

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

领域层 

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

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

   

java 代码
  1. ApplicationContext ctx = new ClassPathXmlApplicationContext( new                   String[] { "applicationContext.xml" });   
  2. service=(BussinessFacade) ctx.getBean("service");  

 

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

表现层  

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

        1、和Spring框架一起来测试

        2、Action中的逻辑很简单,(其实Facade中封装了领域对象的协作,也可看作一种控制器)测试的目的是:

            1)看看参数传过来没有

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

            3)XML或JSon的返回串拼接的是否正确。

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

        3、实际上返回的领域对象只是Mock Object。

       我们的测试很原始,还没有使用过StrutsActionTest这样的框架,只是直接使用Tomcat来测试(不过已经比直接使用WebLogic容易多了)。

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

  关于Hibernate配置文件的问题是这样的:

 

xml 代码
  1. <bean id="sessionFactory"  
  2.     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  3.     <property name="configLocation">  
  4.         <!-- <value>WEB-INF/classes/Account-Hibernate.cfg.xml</value>-->  
  5.           <value>Account-Hibernate.cfg.xml</value>    
  6.     </property>  
  7. </bean>  

       我们不得不在进行DAO测试时,使用没有注释掉的value来读取cfg.xml。而在测试Action时,又需要使用注释掉的配置。   

      我觉得或许采用下面的策略能好些,不过不知道各位在自己的项目中都是如何做的:

       测试表现层时用专为测试这一层的Spring配置文件(我们采用了org.springframework.web.context.ContextLoaderListener这种方式),避免和Hibernate配置文件挂上联系。

 

持久层

        采用DAO模式,我们的DAO很简单,就是直接调用Spring的getHibernateTemplate的方法,于是测试的时候关键就是测试:

     1、HQL语句是否书写正确,SQL语句是否生成正确

     2、Hibernate映射是否写的正确

     3、Sping和Hibernate基础设施是否配置正确

     4、是否按照预期完成CRUD操作。

     测试一个DAO需要耗时2秒,而不是0.12秒。不过如果基于上面的目的进行测试也无可厚非。

 

单元测试真的是这样做的吗?

       按《JUnit in Action》上的说法,单元测试还包括集成单元测试,功能单元测试。

      所以看上去,在DAO层和控制层测试时是绑定了框架一起进行测试是有道理的,可以称之为集成单元测试。那么我还是有以下疑问:

     1、这样做是正确的吗?大家都是怎么做的?

     2、持续集成中运行单元测试包不包括这部分集成单元测试呢?还是仅包含测试业务逻辑的领域层测试

     3、对于报表驱动的业务系统(类似于Kent他们第一次使用XP时做的那个系统),这样做正确吗?不过我们的业务也很复杂。

 

ionic之如何应用karma进行单元测试

karma测试1. 创建ionic项目ionic start ionic-testing tabscd ionic-testing2. 安装karma插件npm install karma karma...
  • xuexiiphone
  • xuexiiphone
  • 2016年08月17日 18:00
  • 1212

Ionic单元测试(Unit Tests)

代码测试的必要性,对任何编程语言都毋需赘述,JavaScript和HTML自然不例外。本文描述如何对Ionic/Angular进行单元测试(Unit Tests)及端对端(End to End Tes...
  • u010730126
  • u010730126
  • 2016年04月07日 12:11
  • 1416

使用Junit进行单元测试时遇到的问题记录[下]

10、  命名问题:source、target;upperBound、upperLimit、lowerBound;greaterThan即gt即大于、ge即greaterEquals即大于等于、low...
  • ywytom
  • ywytom
  • 2017年03月07日 16:07
  • 331

Java mocking 单元测试框架介绍

我需要在数据库里插入一些数据,基于这些真实的数据我才可以进行单元测试,而且每次都需要重复准备脚本,还要考虑数据的清理。 我需要启动一个Tomcat,然后通过Http Client发送请求,然后观察数...
  • u012385190
  • u012385190
  • 2017年05月02日 15:18
  • 659

CUnit C单元测试轻量级框架

CUnit下载地址: http://sourceforge.net/projects/cunit/ CUnit 在线文档帮助:http://cunit.sourceforge.net/doc/ind...
  • yongchurui
  • yongchurui
  • 2015年04月20日 19:04
  • 2890

SSM整合&amp;单元测试集成备忘

ssm整合   阅读原文请访问我的博客brightloong's blog  SSM框架,既是Sping + Spring MVC + Mybatis,本篇博文主要是作为本人的备忘,记录...
  • cl534854121
  • cl534854121
  • 2017年07月26日 10:18
  • 208

Android 单元测试之Espresso - Google官方UI测试框架

Android 单元测试之Espresso - Google官方UI测试框架Espresso是Google官方推出的Instrumentation UI测试框架,在API支持方面有着天然的优势,在推出...
  • EthanCo
  • EthanCo
  • 2016年08月29日 09:02
  • 1692

JUnit单元测试框架的使用

原文地址 http://www.open-open.com/lib/view/open1462177214142.html 我们写单元测试,一般都会用到一个或多个单元测试框架,在这里,我们介绍一...
  • mao520741111
  • mao520741111
  • 2016年05月20日 15:44
  • 35432

python 几种常用测试框架

测试的常用规则 一个测试单元必须关注一个很小的功能函数,证明它是正确的;每个测试单元必须是完全独立的,必须能单独运行。这样意味着每一个测试方法必须重新加载数据,执行完毕后做一些清理工作。通常通过...
  • zcabcd123
  • zcabcd123
  • 2017年02月06日 14:16
  • 804

Qt单元测试QTestLib

1  概述 QT提供内部的单元测试库,使用方便。 2 目的:使用内部功能进行单元测试。 2.1 功能测试 根据输入,测试输出结果。 2.2 GUI功能测试 根据UI事件输入,并测试输出结果。 3 原理...
  • yansmile1
  • yansmile1
  • 2016年12月20日 14:16
  • 1412
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:当单元测试遇到框架(转:来自javaeye 作者:sslaowan)
举报原因:
原因补充:

(最多只允许输入30个字)