`
jgsj
  • 浏览: 957384 次
文章分类
社区版块
存档分类
最新评论

一个通用的单元测试框架的思考和设计01-思考篇

 
阅读更多
1.先从问题说起
写过程序的同学都知道,做好单元测试提高代码覆盖率对整个项目意味着什么,但是做好单元测试并不是一件那么简单的事情,因为实际业务逻辑和运行环境的复杂性,导致了我们的单元测试代码不可能都像那些helloWord那么简单,比如现在的业务系统绝大多数都是基于数据库的,怎么做单元测试才能做到每次做单元测试时都是一个干净的测试环境-即上次单元测试的数据库操作不会影响本次测试的结果(比如一个createUser操作,第一次单元测试运行成功了,但是第二次运行却失败了,因为代码里做了重名判断),还有web层的单元测试如何进行,web框架如何启动,那些万恶的httpServletRequest,HttpSession等接口,头大。。。

2.现有的框架及对比

目前有很多的开源测试框架,一下列举几个最常用的

junit这个地球人都知道,单元测试的先祖框架,核心,掌握他并熟练运用那是必须滴

testNG,号称下一代单元测试框架,火了一阵子,功能比junit更强大,但是依旧无法撼动junit的王者地位
dbunit,基于数据库的测试框架,提供了可以通过xml格式来准备数据的方案,使测试数据和真实的数据库数据分离开,测试者可以针对自己在文件中造的数据进行程序的断言,也提供了一个与junit集成的基类DBTest,这个基类封装了一些dbunit启动的操作,把一些通用复杂的操作对操作者透明,但是这也是一个劣势,就是一旦继承了这个基类,你就无法继承自己的类(都是java单继承惹的祸)
SpringTest框架,spring2.5以后提供了一个test框架,提供了大量的基类,测试框架会自动启动spring容器,把spring中的bean自动注入进来,另外还提供了可以对测试方法进行事务控制,每个测试方法测试完成后通过框架控制自动回滚的功能,优势很明显,充分发挥了spring框架的优势,对开发者屏蔽细节,自动事务控制,缺点也很明显,测试必须依赖于spring框架,对于那些没用到spring框架的项目来说只能望洋兴叹了
Struts2Test,struts2提供的单元测试用例基类,提供对httprequest,response,session等对象mock(基于spring test 框架),可以初始化struts框架,这对基于struts2的应用系统来说是个福音,不幸的是要用这个框架,必须依赖spring框架,否则一切玩完
3.框架设计的目标
核心的框架都在上面了,不难看出,在这几个主流框架的使用中,spring框架在其中扮演了很重要的角色,如果项目中没有用到spring,有些测试框架的支持功能根本无法使用!如何让各个框架可以很容易的整合起来又能发挥自身最大的优势呢?

在进行具体的设计之前,我们来展望一下我们期望的测试流程是怎么样的(图)


测试开始前记录数据库状态是1,开始测试后把属于某个测试用例的准备数据加载到数据库中,这时候数据库的状态已经变成了2,接着运行具体的测试用例,测试方法中有对数据库的操作,因此变成了状态3,我们希望对测试的方法进行事务控制,这样在该方法内做的所有数据库操作都可以在测试完成后被会被回滚到先前状态,因此测试方法执行完后,状态又变回了2,当该测试用例的测试方法都执行完毕后,框架负责把先前插入的准备数据删除,这样数据库状态又回到了原始的状态1,这样的优势非常明显,无论这个测试用例执行多少次,用例执行完毕后测试后都会回到原始状态,不会对现有数据造成污染又能保证每次执行都用相同的数据,何乐不为?
刚刚谈了理想,接下来看一下怎样的一个框架才能满足我们的需求
1)不需要和任何框架耦合在一起
这点很重要,整个框架应该围绕一个基本测试框架展看如testng或junit而不是spring这种重量级的框架(相对junit来说spring已经是很重量级的东东了)
2)可以很容易为框架添加新的特性,但是不需要改动框架本身的代码
--对于spring test或dbunit等框架,相对于我们的测试框架只是一些功能上的enhancement,可以通过功能扩展加到框架中,而不是通过继承他们提供基类的方式来直接依赖他们
3)准备测试数据
做基于db的单元测试的人都有感触,单元测试很大一部分时间都在准备数据,因此框架应该支持让使用者通过更加便利的方式去准备数据如常用的excel文件或xml文件或其他csv格式
框架使用者不需要去手动的加载这些数据准备文件,框架需要提供一种契约,如文件名和类名名称路径保持一致,框架自动为当前测试类加载对应的数据,框架使用者只需要书写测试代码,把测试数据放到指定文件夹下即可
4)事务控制
这个没什么捷径,只能靠jdbc的api来实现
分享到:
评论

相关推荐

    性能测试从零开始:LoadRunner入门与提升

    12.1.2 Automation Center性能测试框架设计实例 319 12.1.3 定义XML格式的性能测试任务文件 325 12.1.4 Automation Center性能测试调度运行 329 12.1.5 性能测试报告诊断系统 330 12.2 核心技术及具体实现方法 332 ...

    java 编程入门思考

    15.2.1 一个简单的服务器和客户机程序 15.3 服务多个客户 15.4 数据报 15.5 一个Web应用 15.5.1 服务器应用 15.5.2 NameSender程序片 15.5.3 15.5.3 要注意的问题 15.6 Java与CGI的沟通 15.6.1 CGI数据的编码 15.6.2...

    asp.net知识库

    DbHelperV2 - Teddy的通用数据库访问组件设计和思考 也论该不该在项目中使用存储过程代替SQL语句 如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典...

    传智播客扫地僧视频讲义源码

    15_信息系统框架集成第三方产品案例_框架实现第一个socket类厂商实现 16_信息系统框架集成第三方产品案例_第二个socket类厂商实现 17_信息系统框架集成第三方产品案例_加解密抽象类和加解密厂商类实现 18_信息系统...

    软件设计规范

    如果我们所说非虚,那么如何为架构下一个定义-一定是一个由具体业务流量和模式支撑的架构) 软件(算法)的构造。一个是数据的复杂性(内在互相关系),一个是计算方法(步骤和缓冲)。从宏观角度,数据关系是更...

    AFC.SocketNet项目基于TCP协议高并发多线程协议可配置的通迅模块.zip

    这项任务通常要求学生运用所学专业知识,通过独立研究和创新,完成一个实际问题的解决方案或者开展一项有价值的项目。 首先,毕业设计的选择通常由学生根据个人兴趣、专业方向以及实际需求来确定。学生需要在导师的...

    cascades:Go 中与语言无关的基于流的编程 (FBP) 框架

    Cascades 是一个通用编程框架,但我们创建了它,正如 JP Morrison 所描述的那样:一个数据工厂心理形象,其中应用程序表示为对数据流的一系列转换——这需要根本性的改变从老冯诺依曼程序员构建应用程序的方式思考。...

    信息架构:超越Web设计(第4版)(全彩).[美]Louis Rosenfeld(带详细书签) PDF 下载 高清 完整版

    为了引导你通过这个广阔的生态系统,本书为数字设计提供了经得起时间考验的基本概念、方法和技术。用户体验设计师、产品经理、开发人员和数字设计中涉及的所有人,都要学习如何创建帮助人们与你的信息进行交互的语义...

    信息架构 超越Web设计(第4版).pdf

    其中描述了信息组织的普遍和永恒原则,这一原则也适用于不断增长的移动世界。在第4版中,作者运用大量最新的插图和例子为这些原则提供了当前实践中的情境,验证了那些与技术和供应商无关的工具,以及那些经受住时间...

    Perl最佳实践(中文版).pdf

    《Perl最佳实践》讲述了许多关于Perl语言的编程规则、使用惯例、开发标准和最佳实践,这些内容不仅有助于程序员之间的交流和协同工作,同时也提供了一套思考问题的可靠框架和一种表述解决方案的通用语言。...

    Perl最佳实践 中文版

    《perl最佳实践》讲述了许多关于perl语言的编程规则、使用惯例、开发标准和最佳实践,这些内容不仅有助于程序员之间的交流和协同工作,同时也提供了一套思考问题的可靠框架和一种表述解决方案的通用语言。...

    Perl 最佳实践(CHM)

    《Perl最佳实践》讲述了许多关于Perl语言的编程规则、使用惯例、开发标准和最佳实践,这些内容不仅有助于程序员之间的交流和协同工作,同时也提供了一套思考问题的可靠框架和一种表述解决方案的通用语言。...

    Perl最佳实践

    《Perl最佳实践》讲述了许多关于Perl语言的编程规则、使用惯例、开发标准和最佳实践,这些内容不仅有助于程序员之间的交流和协同工作,同时也提供了一套思考问题的可靠框架和一种表述解决方案的通用语言。...

    行为驱动开发在Python开发测试中的应用

    基于这一思想,本文以Linux平台为基础,图文并茂的解析了其应用于Python的开发测试过程,并给出了Python语言Lettuce测试框架搭建的详细步骤。既有助于用户形象理解BDD理论,又对Python学习者有很好的借鉴意义。说到...

    Scala程序设计(第2版)

    19.1 一个较为激进的示例:Ruby on Rails框架中的ActiveRecord库 396 19.2 使用动态特征实现Scala 中的动态调用 397 19.3 关于DSL的一些思考 402 19.4 本章回顾与下一章提要 402 第20章 Scala的领域...

    c#学习笔记.txt

    /* 你能看得出来,这不是一篇正规的技术文章,所以若你不小心从里边读到了一个爱情故事,可不要奇怪。有很多人用程序来表述爱情,在其中我能看到有Money,有Girl,有一些还涉及到Sex,但是我没有找到Love,我始终相信...

    PersonalBlog

    学习了著名开源社区CommunityServer(CS)的抽象数据库的设计,自己独立思考,站在哲学的角度上思考问题,并进一步抽象,最终设计出了一套非常抽象的通用数据库以及通用数据访问层。主要有以下优点:1)通过两个抽象...

Global site tag (gtag.js) - Google Analytics