`
wuhua
  • 浏览: 2111947 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

我的第一个真正意义上的测试

阅读更多
       前段日子很无聊,也是很无奈的。经过了这段日子的,我想了很多事情,虽然全部想通,但却努力的去想了。我想这样就Ok了
对吗?
       好了。前阵子,老板请喝早茶,顺便跟我们这些技术人员讨论了怎么样可以提高我们内功的问题。我老板也是技术出身的。有相当多的经验,当然我最初的想法并不是去研究测试,我直接提出:“我觉得我们应该提高我们对设计模式的理解”。他却不怎么同意,说测试才是我们现在的当务之急,然后很肯定的说。TDD,重构都是建立再单元测试基础上的。并推翻了我的建议:”有空让对设计模式有深厚理解的员工给我们上课“。
       开始由于我个人原因,或许我是个很情绪话的员工,也许在另外一家公司我可能早就被T。也许老板对我太好了。^_^
我当时不怎么响应,总是做自己喜欢做的事情,后来自己慢慢觉得自己的工作态度不对,所以昨天试着努力纠正自己的错误,真是在这样的环境下,自己写出了自己第一个我认为真正意义上的测试,把它记录下来。
       测试的要求:
       测试对一个Account的Dao操作以及Service。
java 代码
 
  1. //先来测试最基本的dao吧  
  2. package org.wuhua.dao;  
  3.   
  4. import java.util.Collection;  
  5.   
  6. public interface IBaseDao {  
  7.     Object save(Object o);  
  8.     void delete(Object o);  
  9.     Object update(Object o);  
  10.     Collection list();  
  11. }  
根据我的理解,测试的对方要跟mock的对象分开,(开始我一直认为你要mock的对象就是你要测试的东西,搞着搞着,我就很迷茫了。)。现在要做的就是看你IBaseDao的实现是什么了。如果实现是采用SpringHibernateTemplate的话你就去mock一个这样对象,不过此对象并不是接口,所以你要用到easymock的扩展包,以对它的支持。如果你实现的采用纯Hibernate的话。那你就去mock一个SessionFactory吧。很简单吧,难道这就是所谓的解耦吗?我想是的,这正是解耦。 哈哈

看下我的实现吧,采用Spring实现。
java 代码
 
  1. package org.wuhua.dao.impl;  
  2.   
  3. import java.util.Collection;  
  4.   
  5. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
  6. import org.wuhua.dao.IBaseDao;  
  7.   
  8. public class BaseDao extends  HibernateDaoSupport  
  9. implements IBaseDao {  
  10.   
  11.     public void delete(Object o) {  
  12.          this.getHibernateTemplate().delete(o);        
  13.     }  
  14.   
  15.     public Collection list() {  
  16.        
  17.         return null;  
  18.     }  
  19.   
  20.     public Object save(Object o) {  
  21.         return this.getHibernateTemplate().save(o);  
  22.             
  23.     }  
  24.   
  25.     public Object update(Object o) {  
  26.         this.getHibernateTemplate().update(o);  
  27.         return o;  
  28.     }  
  29.   
  30. }  
测试代码
java 代码
 
  1. package org.wuhua.dao;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import junit.framework.TestCase;  
  6.   
  7. import org.easymock.MockControl;  
  8. import org.easymock.classextension.MockClassControl;  
  9. import org.springframework.orm.hibernate3.HibernateTemplate;  
  10. import org.wuhua.dao.impl.BaseDao;  
  11.   
  12. public class BaseDaoTest extends TestCase {  
  13.   
  14.     MockControl control;  
  15.   
  16.     private HibernateTemplate ht;  
  17.   
  18.     private BaseDao baseDao;  
  19.   
  20.     protected void setUp() throws Exception {  
  21.         control = MockClassControl.createControl(HibernateTemplate.class);  
  22.         ht = (HibernateTemplate) control.getMock();  
  23.         baseDao = new BaseDao();  
  24.         baseDao.setHibernateTemplate(ht);  
  25.     }  
  26.   
  27.     public void testSave() {  
  28.         Object o = new Object();  
  29.         ht.save(o); 
  30.         //这里我是有疑问的。
  31.         //1,为什么HibernateTemplate返回的是Serializable。
  32.         //2,设置的返回植为什么一定要跟调用ht.save(o)一致呢?
  33.         control.setReturnValue(new Wuhua());  
  34.         control.replay();  
  35.         baseDao.save(o);  
  36.         control.verify();  
  37.     }  
  38.       
  39.     public void testUpdate() {  
  40.         Object a = new Object();  
  41.         ht.update(a);  
  42.        
  43.         control.replay();  
  44.         try {  
  45.             baseDao.update(a);  
  46.             fail("Not catch exception!");  
  47.         } catch(Exception e) {  
  48.                
  49.         }  
  50.         control.verify();  
  51.     }  
  52.       
  53.     class Wuhua implements Serializable {}  
  54.   
  55. }  
上面就是我第一次很认真的测试,有很多不明白的地方
分享到:
评论
12 楼 hyysguyang 2006-12-07  
wuhua 写道
补充一句:
关于Dao测试的问题
1用mock来测试
2直接用真实环境去测试

1。
如果用mock的话,我只是测试我Dao实现是否按照自己预期的效果去测。比如,你mock HibernateTemplate,然后调用find(hsql),好现在的测试结果是,测试的时候将会比较这两次hsql
是否一致,至于hsql是对是错,自己可以再写一个测试专门来负责测试HibernateTemplate.find(hsql)方法。这样对于定位错误是比较有好处的。也就是细分测试的问题
至于第2个网上讨论的也不少,而起本人对此的理解还很普通


还是那个原则,有逻辑就采用plain的方式测,mock也好stub也吧,否则,直接进行集成单元测试就OK了。
对与数据库DAO的测试,我也是这样的,有逻辑我就可能mock,否则,就直接连接数据库的测试。

我不知道这样对不对,因此我遵循这样的原则:如果对某个功能不放心,就写相应的测试,否则就OK了。这也是我从without ejb上学到的。的确,以前我一直不知道我该怎么测?该不该测。
,还想,自从遵循这个原则之后没有那么困惑了。
11 楼 hyysguyang 2006-12-07  
wuhua 写道

受教了。

觉得很有道理。如果纯粹是为了验证自己的写的SQL是否错误,难道就一定要用数据库去验证吗?
没有其他更好的办法,或者更优雅的解决方法吗?

呵呵,你不应该认为,我们只提到sql就认为只是为了验证sql,也许还包括其他的,比如,如果你使用乐存储过程,或者触发器之类的。
事实上,我也不认为必须要连接数据库,如果我现在只是为了测我写的SQL对不对,而且我已经有了某一个工具(比如,自己写一个检查SQL语法的工具,当然,你这个工具要能够集成进你的测试代码中),那我像我不会去连接数据库的。因为比较连接数据库还是很慢的,而测试的速度必须尽可能的快。
10 楼 wuhua 2006-12-07  
补充一句:
关于Dao测试的问题
1用mock来测试
2直接用真实环境去测试

1。
如果用mock的话,我只是测试我Dao实现是否按照自己预期的效果去测。比如,你mock HibernateTemplate,然后调用find(hsql),好现在的测试结果是,测试的时候将会比较这两次hsql
是否一致,至于hsql是对是错,自己可以再写一个测试专门来负责测试HibernateTemplate.find(hsql)方法。这样对于定位错误是比较有好处的。也就是细分测试的问题
至于第2个网上讨论的也不少,而起本人对此的理解还很普通
9 楼 wuhua 2006-12-07  
hyysguyang 写道
wuhua 写道
分层的原因很多。这里我的看法片面就不说了
但对于mock来说是有莫大好处的。
比如service测试的时候完全可以做到隔离数据库,

我现在的意思是,
居然Service可以隔离Dao层,也就是说Dao层也是可以做到隔离相关的数据实现的。也是可以mock一个对象。而并非用实际的连接去代替。如果我们的逻辑没出错的话,测试就算通过了,至于数据层的检测,那就不关我们的事情了,比如Hibernate由Hibernate去test,Spring由Spring去Test,Oracle由它自己去做。干自己的事情,别趟其他浑水。这样不是潇洒很多吗


但是数据库的测试毕竟比较特殊,记住测试的目的是确保你的代码质量,如果你确定你的这样测就没问题了,那无话可说,否则就尽量多的测试。
事实上,最原始的单元测试(plain testcase)就是用来测方法,测业务逻辑的,如果有逻辑就测,没逻辑就不用测了,同样的道理,相信你不会去测一个bean的get/set方法吧。
记住你测试的目的和动机,如果你认为测试dao层是为了测你的逻辑(你确定你的dao的实现代码是否真的存在逻辑),那你就mock吧,但是,我们更相信,我们测DAO层,更应该是测访问数据库的情况,你如连接,sql是否正确,sequence是否正确等,而这些你必须要真正的连接数据库,也因此,我们一般都是直接访问数据库来测试的,当然,如果可能你可以采用内存库。
事实上,我们对dao的测试,一般都进行所谓的的集成单元测试。我认为,你应该确定好你的测试策略,然后在去采用相应的测试方法。我在目前的开发中就是采用这样的方式测的。


受教了。

觉得很有道理。如果纯粹是为了验证自己的写的SQL是否错误,难道就一定要用数据库去验证吗?
没有其他更好的办法,或者更优雅的解决方法吗?
8 楼 hyysguyang 2006-12-07  
wuhua 写道
分层的原因很多。这里我的看法片面就不说了
但对于mock来说是有莫大好处的。
比如service测试的时候完全可以做到隔离数据库,

我现在的意思是,
居然Service可以隔离Dao层,也就是说Dao层也是可以做到隔离相关的数据实现的。也是可以mock一个对象。而并非用实际的连接去代替。如果我们的逻辑没出错的话,测试就算通过了,至于数据层的检测,那就不关我们的事情了,比如Hibernate由Hibernate去test,Spring由Spring去Test,Oracle由它自己去做。干自己的事情,别趟其他浑水。这样不是潇洒很多吗


但是数据库的测试毕竟比较特殊,记住测试的目的是确保你的代码质量,如果你确定你的这样测就没问题了,那无话可说,否则就尽量多的测试。
事实上,最原始的单元测试(plain testcase)就是用来测方法,测业务逻辑的,如果有逻辑就测,没逻辑就不用测了,同样的道理,相信你不会去测一个bean的get/set方法吧。
记住你测试的目的和动机,如果你认为测试dao层是为了测你的逻辑(你确定你的dao的实现代码是否真的存在逻辑),那你就mock吧,但是,我们更相信,我们测DAO层,更应该是测访问数据库的情况,你如连接,sql是否正确,sequence是否正确等,而这些你必须要真正的连接数据库,也因此,我们一般都是直接访问数据库来测试的,当然,如果可能你可以采用内存库。
事实上,我们对dao的测试,一般都进行所谓的的集成单元测试。我认为,你应该确定好你的测试策略,然后在去采用相应的测试方法。我在目前的开发中就是采用这样的方式测的。
7 楼 抛出异常的爱 2006-12-07  
wuhua 写道
分层的原因很多。这里我的看法片面就不说了
但对于mock来说是有莫大好处的。
比如service测试的时候完全可以做到隔离数据库,

我现在的意思是,
居然Service可以隔离Dao层,也就是说Dao层也是可以做到隔离相关的数据实现的。也是可以mock一个对象。而并非用实际的连接去代替。如果我们的逻辑没出错的话,测试就算通过了,至于数据层的检测,那就不关我们的事情了,比如Hibernate由Hibernate去test,Spring由Spring去Test,Oracle由它自己去做。干自己的事情,别趟其他浑水。这样不是潇洒很多吗


jsp --- web ----service ------dao ----db

jsp-----web 这个很难测试
dao-----db  这个用内存测试

----service----- 测试起来很方便但是业务简单的话...好麻烦...
6 楼 wuhua 2006-12-07  
分层的原因很多。这里我的看法片面就不说了
但对于mock来说是有莫大好处的。
比如service测试的时候完全可以做到隔离数据库,

我现在的意思是,
居然Service可以隔离Dao层,也就是说Dao层也是可以做到隔离相关的数据实现的。也是可以mock一个对象。而并非用实际的连接去代替。如果我们的逻辑没出错的话,测试就算通过了,至于数据层的检测,那就不关我们的事情了,比如Hibernate由Hibernate去test,Spring由Spring去Test,Oracle由它自己去做。干自己的事情,别趟其他浑水。这样不是潇洒很多吗
5 楼 抛出异常的爱 2006-12-07  
如果不连接数据库
那为什么要分dao层?
service层
4 楼 wuhua 2006-12-07  
也就是测试Dao还是要连接数据库才是有意义的吗?
3 楼 抛出异常的爱 2006-12-07  
用内存库进行测试DAO
我是在setup时将数据写到那个表中
而在teardown时将所有表中的数据清除
(不要用hibernate的删除,用jdbc的会快一到二个数量级....)
2 楼 wuhua 2006-12-07  
那这段代码也是mock的,它的测试原理也是发送SQL,但是也没有真正的连接数据,而起,也可以得到预期的效果
public void testGetAccount(){
		Account a = new Account("wuhua");
		a.setId("10");
		List list = new ArrayList();
		list.add(a);
		
		ht.find("from Account as a where a.id=?", a.getId());
		
		control.setReturnValue(list);
		
		control.replay();
		
		List ls = (List) accountDao.findAccountById(a.getId());
		
		assertNotNull(ls);
		Assert.assertEquals(1, ls.size());
		Account ac = (Account) ls.get(0);
		
		Assert.assertEquals(a.getId(),ac.getId());
		Assert.assertEquals(a, ac);
		
		control.verify();
		
	}


//这是真正的实现代码
public Collection findAccountById(String id) {
		return this.getHibernateTemplate().find("from Account as a where a.id=?" , id);
	}


也就测试的时候如果你from Account as a where a.id=?这个语句错了。跟Id错了。测试是通过不了的
1 楼 robbin 2006-12-07  
测试DAO不如连数据库一起测试吧。因为DAO测试的目的不是DAO接口实现对不对,而是测试是否如你预期的发送了SQL,如你预期的返回了结果集。这个时候你Mock之后,测试就没有意义了。

相关推荐

    U盘扩容检测工具 第一款真正意义上的U盘扩容检测工具

    第一款真正意义上的U盘扩容检测工具 集5大功能于一身:扩容检测、坏块扫描、速度测试、老化测试、坏块屏蔽 MyDiskTest是一款U盘/SD卡/CF卡等移动存储产品扩容识别工具。可以方便的检测出存储产品是否经过扩充容量,...

    U盘检测工具-第一款真正意义上的U盘扩容检测工具

    第一款真正意义上的U盘扩容检测工具 集5大功能于一身:扩容检测、坏块扫描、速度测试、老化测试、坏块屏蔽 MyDiskTest是一款U盘/SD卡/CF卡等移动存储产品扩容识别工具。可以方便的检测出存储产品是否经过扩充容量,...

    八上政治第一单元测试题.pdf

    这篇文档主要涉及的是初中政治(思想品德)第一单元的相关测试题,主要涵盖个人与社会的关系、社会责任、亲社会行为以及互联网的影响等知识点。 1. 个人与社会的关系:题目指出,人的成长离不开社会,投身社会的...

    在ASPX中之用的图片新闻切换插件,Silverlight做好的,有例子,长宽真正意义上完全自适应

    描述中提到“Silverlight做好的,有例子,长宽真正意义上完全自适应”,意味着这个插件是使用Silverlight技术开发的,并且具备响应式设计特性,可以自动调整其大小以适应不同设备或浏览器窗口的尺寸。这意味着无论...

    测试你下你的杀毒软件究竟有多强

    这个文件并非真正的恶意软件,而是一个被广泛接受的标准测试文件,用于验证杀毒软件能否正确识别已知的安全威胁。通过这种方式,用户可以方便地检查自己所使用的杀毒软件是否具备基础的防护能力。 ### 知识点四:...

    U盘检测工具MyDiskTest MyDiskTest

    第一款真正意义上的U盘扩容检测工具 集5大功能于一身:扩容检测、坏块扫描、速度测试、老化测试、坏块屏蔽 MyDiskTest是一款U盘/SD卡/CF卡等移动存储产品扩容识别工具。可以方便的检测出存储产品是否经过扩充容量,...

    1196汽车文化西南大学19秋章节测试答案.pdf

    5. 1881年,古斯塔夫·特鲁夫展出的电动汽车是世界上第一辆真正意义的电动汽车,为三轮设计。 6. ABS是防抱死系统,防止紧急刹车时轮胎抱死。 【智能运输系统与环保燃料】 1. 代用燃料包括天然气、二甲醚、醇类...

    河南省洛阳市东升八年级政治上册(第一课 我的父亲母亲)同步测试题 人民版 试题.doc

    题目围绕着日本著名影星北野武与其母亲的故事展开,引导学生深入思考父母的爱、孝敬父母的意义以及如何理解和承担家庭责任。 1. 知识点:父母的爱是无私的。北野武的母亲表面上对他苛刻,实际上是为了激励他努力...

    七年级语文上册 第一单元 测试1 苏教版 试题.doc

    总结:这份七年级语文上册第一单元的测试题涵盖了语文学习的基础知识,如汉字拼音和书写,古诗词默写,成语运用,以及对文学的个人感悟和理解。同时,还包含了对文学作品的深度阅读和分析,以及对文学价值的认识,...

    MyDiskTest (u盘坏块检测工具)

    第一款真正意义上的U盘扩容检测工具 集5大功能于一身:扩容检测、坏块扫描、速度测试、老化测试、坏块屏蔽 MyDiskTest是一款U盘/SD卡/CF卡等移动存储产品扩容识别工具。可以方便的检测出存储产品是否经过扩充容量...

    U盘真伪坏块速度测试检测工具MyDiskTest 2.5下载

    是第一款真正意义上的U盘扩容检测工具,此外这款工具还可以检测FLASH闪存是否有坏块,是否采用黑片,不破坏磁盘原有数据。并可以测试U盘的读取和写入速度,对存储产品进行老化试验。是我们挑选U盘和存储卡必备的...

    七年级政治上册 第一单元 珍爱生命热爱生活 第一课 生命最宝贵测试题(无答案) 鲁教版 试题.doc

    总结:这个测试题涵盖了生命伦理、社会责任、环境保护、法律意识、防灾减灾、青少年安全教育、见义勇为和科技进步等多个方面,旨在培养学生的全面素质,提高他们对生命的敬畏和尊重,以及对社会和自然的责任感。...

    测试文档与程序员交互

    - **理解模板本质**:只有当使用者能够深刻理解模板各部分的意义及其适用场景时,模板才真正发挥价值。 - **灵活变通**:在某些情况下,可以根据实际情况调整模板内容,甚至是完全舍弃某些部分。 2. **模板依赖**...

    Fuzzing-模糊测试--强制性安全漏洞发掘

    - **第一部分**:介绍了不同类型的模糊测试,如协议模糊测试、API模糊测试等,并探讨了这些测试的基本原理和应用场景。 - **第二部分**:重点介绍了模糊测试在不同目标下的应用,例如文件格式模糊测试、Web应用程序...

    高一英语模块一第一单元测试北师大版.doc

    这篇文档是针对高一学生的一份英语模块一第一单元的测试卷,主要包含单项填空和完形填空两个部分,旨在检验学生的词汇运用、语法理解以及语境推理能力。 在单项填空中,题目涉及了形容词boring与bored的区别、代词...

    转载软件测试试题

    单元测试是在软件开发过程中非常关键的一个环节,其主要策略包括: - **白盒测试**:基于内部逻辑结构进行测试。 - **黑盒测试**:仅关注输入输出的行为,不关心内部实现细节。 - **灰盒测试**:结合白盒和黑盒测试...

    八年级道德与法治上册第一单元走进社会生活综合测试题新人教版.doc

    这篇文档是针对八年级道德与法治课程的一个单元测试,主题为“走进社会生活”。测试题主要涉及人与社会的关系,社会化的意义,以及培养亲社会行为的重要性。 1. 人与社会的关系:文档中提到的一滴水与大海的比喻,...

    扩容卡检测U盘扩容检测工具集合(ChipEasy芯片无忧MyDiskTest)

    第一款真正意义上的U盘扩容检测工具集几大功能于一身:扩容检测、坏块扫描、速度测试、坏块屏蔽等 这两款软件都是专业的U盘扩容检测工具,很多 第一款真正意义上的U盘扩容检测工具集几大功能于一身:扩容检测、坏块...

    《道德与法治》七年级下册第一单元测试卷(含答案).doc

    这篇文档是关于七年级下册《道德与法治》第一单元的测试卷,主要涉及青少年成长过程中的心理变化、青春烦恼的处理以及与人交往的原则。试卷涵盖了多项选择题,涉及了青春的理解、青春期的心理变化、亲子关系、青春期...

Global site tag (gtag.js) - Google Analytics