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

从自身体会谈一谈测试

阅读更多
论坛上关于测试的帖子很多,而且有一部分是一些大牛写的,看得也比较有感触.在这一个帖子里面主要谈一下,自己关于测试的一些理解.

还是从我目前所处项目组的情况说起吧,整个项目开发的架构是从DAO层-BS层-BIZ层-Action展现层,典型的J2EE分层的结构,从名字中就可以看得出DAO层是只对数据库进行操作的,BS层主要处理大量的业务方法,而BIZ层是干什么用的呢?其实BIZ主要是负责事务管理和用户的权限控制的;另外,Action当然是表示层的东西啦,搞java开发的地球人都听说过这一个称谓。在这里,并不想评论公司开发的架构的思想怎样怎样,毕竟论坛里面已讨论了N次,在这里只是想把自身对单元测试的一些体会写出来。开发的时候主要用到的技术情况主要有JSF/WebWork+hibernate+spring,前台方面还大量用了Ext和DWR两个东东。

就目前的项目里20多人,真正愿意写单元测试的其实并不多,大多是怕写测试代码影响了他自己的开发速度,其实这根本是一个伪命题。写代码以及测试的代码相对整个开发流程而言,并不多,相反比较的是你想好怎样去实现这一个功能,还有实现该功能后针对的调整维护会占用比较大的时间.

就目前我对于自己开发的模块,是这样写测试代码的:
对于所有的util公共方法,我基本上都用JUnit来测试。从自身体会来讲,用JUnit来测试一些输出输入很简单,但里面算法处理比较复杂的时候,更显得其测试特别特别有用,这一点感触最深。说到测试,就不能不提一下重构。从我自身体会觉得,如果一个程序员自己没有真正地写过一些的JUnit测试,就对"有效的测试给了重构更多的信心"类似于这样的言语说理解很深刻的话,我根本就不信,根本就是从书上学来的放出来的屁话。我自身是从尝试写JUnit测试到现在变得非常自然地写JUnit测试,因为这样做给了我更大的信心,心里就知道了"哦,这和我想要的一样啦,我可以往下面走了"。顺便八卦一下,半年多来,感觉对自己的开发影响比较大的两本书是<<agile java>>和<<重构>>。

对于很多的DAO方法,我都是这样做的:
利用构建好的一个Hibernate的Flush方法的Interceptor拦截器,实现了里面的public Object invoke(MethodInvocation invocation) throws Throwable方法后,再构建一个BaseDAOTest来继承于spring的AbstractTransactionalDataSourceSpringContextTests测试类来对大部分的DAO方法进行测试.具体不知道怎样做的朋友,可以搜索一下论坛,有大把这样的例子.

对于大部分的BS和BIZ层方法,是利用EasyMock测试驱动写的。在我们的这样的项目组里面的,因为分层多,每一个层次的职责很明确,每一层都是用接口隔离开的,所以这样对EasyMock这样的Mock框架就大有用途了。可惜的是,只能用EasyMock1.2的包,因为我们开的的环境只能用1.4的java SDk。如果可以用EasyMock2.x版本上的时候,测试的代码量就会少一些,但需要JDK 1.5以上的版本啊。没有试过JMock,不知道好不好用。

说到Action层方面,我有一个疑问,想请教一下大家。目前我们项目里面有两个专门进行验收测试的人员,也就是每天对每一个页面的一些细节功能都进行测试,有BUG的话会记录在JIRA或其他的缺陷管理工具上面。现在Action层我们是用JSF,大多情况下是调用BIZ层的接口进行一个数据的展现和编辑,而且很多方法都和EXT,DWR都有一些交互动作。在这种情况下,如果我还是用Mock的情况下,感觉就显得有测试比较脆弱---毕竟项目里面有两个专门进行验收测试的人员,每天都会进行一些回归测试。 所以我想问一下,对于这种情况的Action怎样测试才比较好,才能达到比较好的效果或者就采用目前的形式---根本就没有针对Action这一层写测试?
分享到:
评论
16 楼 cqtzj 2008-09-14  
跟牛人学学,专业性太强了.
15 楼 chc 2008-09-06  
期待有人详细的描述web应用的测试,最好能举例
14 楼 xly_971223 2008-01-24  
我就不怎么喜欢写测试 尤其是简单的东东
做web开发 需要测试的代码并不多
13 楼 xyz20003 2008-01-23  
dbunit用起来超级不爽,它都不会自己管理数据依赖性,导出的数据根本用不了,然后还要自己去调,现在干脆写成sql,用dbdeployer管理sql版本,还在试验中。
12 楼 sg552 2008-01-23  
回楼上的:
觉得测试速度慢,貌似可以设置AbstractxxxTest的一个加载缓存的xml文件属性,你可以查下API。

回楼主的:
测试ACTION,可以使用spring-mock.jar 中的MockHttpServletxxx. 很好用。
11 楼 lighter 2008-01-22  
抛出异常的爱 写道
我是指内存数据库hsqldb
每次起来后...都是空的表
在setup中把要插入的数据insert进去
在tearDown中把插入的数据del进去.

AbstractTransactionalDataSourceSpringContextTest
这东西是不喜欢用的...1是慢,2是对数据库要求同步3.数据要事先作好放到库里才好.

嗯,个人对AbstractTransactionalDataSourceSpringContextTest感觉有点不爽快的地方.
1、相对而言,测试的速度是比较慢
2、假如我们要假如一个C表的某些操作的话,而C表又依赖B表,而B表又依赖A表,这一个时候就很可能要
deleteFromTables(new String[]{"A","B","C"});,然后建立至少一条A表的数据和一条B表的数据和至少一条C表的数据才能测试测试正确,但也保整了数据的完整性。

好处是:比较真实地测试了你DAO层的代码对数据库的一些操作,所以一直在用,感觉也挺方便的;
没有试过hsqldb来进行测试,不知道效果怎样
10 楼 抛出异常的爱 2008-01-22  
我是指内存数据库hsqldb
每次起来后...都是空的表
在setup中把要插入的数据insert进去
在tearDown中把插入的数据del进去.

AbstractTransactionalDataSourceSpringContextTest
这东西是不喜欢用的...1是慢,2是对数据库要求同步3.数据要事先作好放到库里才好.

有时要把session的conn放出来运行desc t_xxxx
得到他有哪些字段才好写测试....很崩馈
如果可能的话自己写建表语句的话
就没这么多问题了.
9 楼 daquan198163 2008-01-22  
不用在tearDown删去刚插入的数据,Spring的那个测试基类AbstractTransactionalDataSourceSpringContextTests(我见过的名字最长的类)可以在每个测试结束后替我们回滚事务

ps:对表结构查询?建表?什么意思
8 楼 抛出异常的爱 2008-01-22  
你忘记说在tearDown删去刚刚插入的数据了.
PS:如何才能用hibernate方便的对表结构查询呢?
(如果建表就更好了)
我用hsqldb想要建表都要写多个hbm.xml
7 楼 daquan198163 2008-01-22  
zdonking 写道
这样也会引起其他的麻烦。比如如何做到数据无关性,dbunit之类的吗?维护那么一份测试数据也够恶心的。(曾经造数据造的想吐)
但如果dao的粒度比较细。造数据就不用考虑太多的数据关联性,甚至可以不用dbunit之类的辅助工具。
ps:web层不包含业务逻辑的话,测试的意义应该不大吧。或许一些公共的action需要做一些正常转向,异常转向等的测试吧。

数据无关性?你的意思是说测试数据互相干扰的问题吧?这个问题Spring的那个测试基类可以解决,每个测试结束它替我们回滚事务。
造数据我不用dbunit,因为还要额外维护数据文件,我一般在setup里面用dao往数据库插数据,现学现卖

ps:web层也有自己的逻辑,比如validator、参数处理、视图转发,还有view里的显示逻辑,都需要测试,selenium擅长做这些
6 楼 lighter 2008-01-22  
daquan198163 写道
你们分的层太多了,不够pragmatic
另外,如果不涉及到对外通信、远程调用的话,用mock隔离测试的意义不大,还不如做集成测试
比如对action的测试,可以如楼上说的那样——用selenium IDE在ff上面录制脚本,copy到junit里面来跑,这个虽然也是用junit来写,但称呼上应该称为FunctionTest加以区别。好处就是连验收测试的回归都可以自动化了
参考SpringSide

有一小部分内容涉及了远程调用,不过不多。
"用selenium IDE在ff上面录制脚本,copy到junit里面来跑",其实比较早就听说这一个东西,但一直没有去尝试。今晚空闲的时候再下载一个新的springside来看一下。分层我们一般都至少四层,写一个普通的CRUD我都快麻木了,没有办法,这一个框架是银行的人里面给定用的,你只能按着规范来写!
5 楼 zdonking 2008-01-22  
这样也会引起其他的麻烦。比如如何做到数据无关性,dbunit之类的吗?维护那么一份测试数据也够恶心的。(曾经造数据造的想吐)
但如果dao的粒度比较细。造数据就不用考虑太多的数据关联性,甚至可以不用dbunit之类的辅助工具。
ps:web层不包含业务逻辑的话,测试的意义应该不大吧。或许一些公共的action需要做一些正常转向,异常转向等的测试吧。
4 楼 daquan198163 2008-01-22  
zdonking 写道
正在郁闷dao和业务逻辑层耦合在一起如何test的人飘过。
ps:或许对一个业务逻辑类中dao部分可以用AbstractTransactionalDataSourceSpringContextTests,业务逻辑部分直接mock后做单元测试。只是这样做,感觉有点...。

这样太麻烦了,只测业务逻辑类就行(用AbstractTransactionalDataSourceSpringContextTests),dao自然就被覆盖到了
3 楼 daquan198163 2008-01-22  
你们分的层太多了,不够pragmatic
另外,如果不涉及到对外通信、远程调用的话,用mock隔离测试的意义不大,还不如做集成测试
比如对action的测试,可以如楼上说的那样——用selenium IDE在ff上面录制脚本,copy到junit里面来跑,这个虽然也是用junit来写,但称呼上应该称为FunctionTest加以区别。好处就是连验收测试的回归都可以自动化了
参考SpringSide
2 楼 抛出异常的爱 2008-01-22  
action
如果没有逻辑多好啊....
一般是用selenium IDE在ff上面.
把测试顺序录下来测试.
1 楼 zdonking 2008-01-22  
正在郁闷dao和业务逻辑层耦合在一起如何test的人飘过。
ps:或许对一个业务逻辑类中dao部分可以用AbstractTransactionalDataSourceSpringContextTests,业务逻辑部分直接mock后做单元测试。只是这样做,感觉有点...。

相关推荐

    软件测试实习总结报告.docx

    一、浅谈测试 测试是软件工程中不可或缺的一部分,然而许多人认为测试是脱离了软件工程范围的工作,不以为屑。但在实际状况中,测试是既重要且难以精湛的。测试人员需要具备编码能力和想象力,能够快速地找到 Bug,...

    学习java的心得体会 (2).docx

    测试工作应由测试工程师来做,但在你写完一个模块或一个软件时,还是要自己先测试一下,保证不要出现一些低级的错误。 七、善于交流善于沟通 善于交流善于沟通,特别是经常与一些高手交流一下学习的心得体会,找对...

    (工作心得体会)一天的工作心得.docx

    ### 工作心得体会——IT行业经验分享 #### 一、工作日常与心态调整 通过《一天的工作心得》这篇文档,我们可以窥见一位IT行业工作者在日常工作中的所思所感。作者提到,一天的工作虽未带来巨大的收获,但却积累了...

    浅谈Java技术学习方法.pdf

    "浅谈Java技术学习方法.pdf" Java是一种简单易用、完全面向对象、有平台无关性、安全可靠的开发工具。自1995年正式问世以来,Java的快速发展已经让整个Web世界发生了翻天覆地的变化。Java技术和应用发展很快,在...

    部编八年级下册《傅雷家书》中考试题答案 2名著复习.doc

    - 第二段傅雷的主要观点是:艺术的领会不能仅停留于表面的理性认识,需要用心灵去体会,使作品的情感成为自己情感的一部分。 3. **《傅雷家书》的家书作用**: - 家书不仅是讨论艺术的平台,还是激发傅聪思考、...

    一个电子工程师的经验之谈

    在现代电子设备中,嵌入式系统无处不在,从智能手机到家用电器,都依赖于这些微小而强大的计算平台。熟悉微控制器、操作系统的选择与裁剪、编程语言(如C或C++)以及调试技巧,都是电子工程师需要掌握的重要技能。 ...

    ios开发介绍&心得&项目&相关练习

    作者结合自己的实际经验,谈到了学习编程语言和框架的重要性,以及团队协作和持续学习在iOS开发中的关键作用。这些心得不仅有助于读者更好地理解iOS开发的本质,还能激发读者对开发的热情和动力。 在项目实践部分,...

    辽宁省辽阳县首山镇第二初级中学2020学年七年级语文11月月考试题(无答案).doc

    学记》中的片段,讨论了“教学相长”的道理,测试学生对文言词汇的理解,如“佳肴”、“是故”、“教学相长”、“困”的意思,以及对文言文句子的翻译,最后要求学生总结文章的中心思想并结合实际谈学习体会。...

    人工智能的以后.pdf

    这台运算机那时日本倾全国之力来造,他们以为从90年代开始人类在人工智能领域已经积存了大量的体会,再通过十年的时刻我就能够够造出这么一台机械来。这台机械只需要内置大体的机制和人工接口,它就会自己取得聪慧和...

    枣核练习题及答案精选.doc

    第二部分的阅读理解主要讲述了一位海外华人如何在自己的后花园中营造出家乡的味道,表达了强烈的思乡之情。花园中的垂杨柳、睡莲池、假山石等元素都是对北京北海公园的再现,反映出她对故乡的深深眷恋。尽管家庭和...

    我自豪,我是少先队员主题会.doc

    通过一系列活动,让学生体会作为少先队员的自豪,同时增强他们对红领巾的认识和爱护,以及对自己行为的严格要求。 【活动目标】 1. 强化学生作为少先队员的自豪感,鼓励他们在日常生活中展现出优秀品质。 2. 增进...

    面试中最常遇到的10个问题和部分面试题目

    - **问题10**:谈你过去的学习和工作,认为最出色的一件事情,具体的说? - **解析**:这个问题考查求职者对自己成就的认识。回答时应详细介绍自己的成功案例以及从中获得的经验教训。 - **问题11**:同事和亲戚对...

    c#学习笔记.txt

    一个结构不能从另一个结构或类继承,而且不能作为一个类的基。但是,结构从基类 Object 继承。结构可实现接口,其方式同类完全一样。 [c ] 与 C 不同,无法使用 struct 关键字声明类。在 C# 中,类与结构在语义上是...

    C语言入门经典(第4版)--源代码及课后练习答案

    1.6.4 测试 13 1.7 函数及模块化编程 13 1.8 常见错误 17 1.9 要点 17 1.10 小结 18 1.11 习题 18 第2章 编程初步 19 2.1 计算机的内存 19 2.2 什么是变量 21 2.3 存储数值的变量 21 2.3.1 整数变量 21 ...

    《2023腾讯云容器和函数计算技术实践精选集》

    - **核心价值**:分享了腾讯云在管理百万级别容器集群方面的心得体会,包括技术架构设计、运维策略等方面。 - **应用场景**:对于希望了解大规模容器集群管理细节的企业和个人来说,具有很强的学习价值。 ##### 14....

    C#微软培训资料

    第一章第一章 第一章 .NET 编 编 编程语言 程语言编程语言 程语言 C#.4 1.1 Microsoft.NET——一场新的革命.4 1.2 .NET 与 C#.6 1.3 C#语言的特点.8 1.4 小 结 .11 第二章 运行环境 全面了解.NET....

    安徽移动2013校园招聘求职大礼包-HiAll2013名企校园招聘笔试(笔经)面试(面经)备战攻略

    #### 第一章 安徽移动简介 **1.1 安徽移动概况** - **官方名称**: 中国移动通信集团安徽有限公司,简称中国移动安徽公司。 - **英文名称**: China Mobile Group Anhui Company Limited (China Mobile Group Anhui ...

Global site tag (gtag.js) - Google Analytics