不要为数据持久层编写单元测试

为增强自信心而写代码

  关于单元测试,其作用我认为更多的是增强开发者的信心,以及作为代码的执行文档(额外的效果)。也就是说,编写单元测试首先是开发者的责任,其次单元测试的粒度由程序员的自信心决定。

  "老板为我的代码付报酬,而不是测试,所以,我对此的价值观是——测试越少越好,少到你对你的代码质量达到了某种自信(我觉得这种的自信标准应该要高于业内的标准,当然,这种自信也可能是种自大)。如果我的编码生涯中不会犯这种典型的错误(如:在构造函数中设了个错误的值),那我就不会测试它。我倾向于去对那些有意义的错误做测试,所以,我对一些比较复杂的条件逻辑会异常地小心。当在一个团队中,我会非常小心的测试那些会让团队容易出错的代码。"

  --XP和TDD的创造者Kent Beck如是说。

  由过去的经验,我认同上述的观点,并且认为不应该将单元测试作为银弹。甚至项目经理应该忘记有单元测试这回事,干脆把那当做程序员的乐趣就好了,然后该有的测试流程和规范必须要求到。

  不要违反原则

  单元测试需遵守的关键原则是:

  1、单元测试应该是可重复的

  2、单元测试应该是独立的

  3、单元测试是快速执行的

  以下为一个坏的例子。

  部门的技术主管一直希望找到一种方法可以普遍提高开发人员的代码水平,以及减少bug和改善设计,这恰恰是单元测试所擅长的。所以我们配合持续集成的实践,在后来的项目中严格要求单元测试。

  不得不说,在经过一段时间的抵触后,大家还是非常喜欢的。因为我们的产品清单上有专门的单元测试时间,并且大家也开始尝到甜头--容易犯的小错少了。

  但是在我们还来不及欢呼的时候,问题出现了,而且很棘手。

  我们的项目大都是关于数据存储的,比如简单的新增、复杂的查询、显示报表等等。而我们的单元测试其实就是冒烟测试,并且还是不合格的单元测试。原因是我们使用数据库的数据作为输入,众所周知,这些数据很容易被修改,故我们的单元测试是不可能具有可重复性。另外,我们的单元测试也不是独立的,因为我们非常依赖数据存储层。

  从以上的描述,你可能猜到,没错,我们的开发人员大多都很初级,经常犯得错误就是关于sql的编写,ibatis的使用语法之类的错误。也就是说他们最不自信的地方就是语法或者工具的使用。

  让单元测试变成可重复的相对简单,使用dbunit之类的工具可以轻松的达到,即使这个工具有时也会出错,比如oracle的Large Objec类型就会报错。但是对数据存储层的依赖就不能避免了,因为这恰恰是我们要测试的。而相比时间而言,前两个因素又显得不那么重要了。

  在项目中,我们对每个dao层的方法都写了单元测试,有的单元测试花费的时间甚至比写代码的时间要多。结果是我们的代码确实是可用的,但是时间却比想象的多得多。比如由A来编写接口,然后由另外一个人B来编写页面,然后由B调用A的接口。花费的时间=编写接口+编写页面+2*调用接口时间(这个名称不怎么好,但是在海没有发现合适的名称时,还是让我们暂时使用它吧)。调用接口时间是指两个人座到一起,A告诉B如何调用他的接口的时间,加上刚好出了问题,A为了方便直接在B的电脑上修改花费的时间。这里的时间都是两份的。

  而我们的项目执行一次单元测试至少要10分钟左右,而且还会报错,因为不可重复性,有时它可以执行成功,有时它并不能。现在我们要花费的时间变成编写接口+编写页面+2*调用接口的时间+n*10分钟。

  之前说了,我们要求单元测试时为了保证接口是可用的,单元测试并不是唯一的方式。假设我们启动项目(5分钟),点击页面进入页面(每次0.5分钟),然后出错查看信息,解决问题(M分钟)。相比之下,使用单元测试则是启动10分钟,出错,设置打印信息,然后启动(10分钟),再设置打印信息。直至发飙。。。

  现在,你应该知道我们的痛苦了。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-09-20 04:27:02

不要为数据持久层编写单元测试的相关文章

Hibernate作为数据持久层的分析和研究

数据 摘要 在Java技术中有许多方法可以对数据进行持久化,持久层也是Java应用程序中最重要的部分之一.本文在分析了3种持久层主流解决方案的基础上,介绍了O-R映射开源项目Hibernate,并介绍了在Web应用开发中怎样配置Hibernate的环境,并使用它建立一个应用. 关键字 hibernate,数据持久化,JDBC, EJB,JDO 数据持久层简介 J2EE的三层结构是指表示层(Presentation),业务逻辑层(Business Logic)以及基础架构层(Infrastruct

ASP数据持久层抽象

数据持久层在所有的系统中都存在.对于小型或者中型的ASP应用,这一点往往不受重视.这篇文章试图改善这一现状,以一种简单的方式提供了简化调用ADO相关对象的方法.这种方法的思想可以延伸到其他编程语言,只要这种语言稍微具备一点点面向对象的思想,那么本篇文章将使你收益. 你还在使用ASP吗?我知道ASP虽然被很多高级的企业级应用抛弃,但是像我一样靠ASP起家的开发者,或者开发一些简单WEB应用的开发者,一定在某些时候还在考虑ASP.它简单,容易使用.在访问数据库方面,通过ADO也能够无所不能.然而使用

在SCA Module中使用iBATIS框架实现数据持久层

在完成 SCA Module 建模后用 Java 对象进行实现时,采用 Hibernate 和采用 iBATIS 实现 SCA Module 的数据持久层,目的都是为 SDO 提供数据访问服务并加快 SCA 模块实现.前文已经讲过关于如何使用 Hibernate 实现 SCA Module 的数据持久层,本文将介绍 iBATIS 框架,比较 iBATIS 和 Hibernate 的异同,并以实例的方式介绍如何使用 iBATIS 实现 SCA Module 的数据持久层. iBATIS 是一种数据

SpringSide开发实战(四):打通数据持久层的任督二脉

在这里,将创建一个简化的用户管理模块,演示怎样利用SpringSide提供的数据持久层 的功能,包括怎样通过Hibernate的Annotation来配置多对一映射和多对多映射. 大家都知道,现在最流行用户管理模型的是RBAC,也就是基于角色的访问控制模型,在 这种模型中,可以划分多个层次,如用户-角色-资源.用户-角色-权限-资源.用户-角色- 角色组-权限-资源.用户-角色-角色组-权限-操作-资源等等,因此,想要创建一个完善而 复杂的用户管理模块,是相当具有难度的.在Web2.0时代,有一

数据持久层 jdorm 1.1 ORM 框架

数据持久层jdorm1.1 orm框架 是基于jdbc 而成,性能高效.新增对enetity验证功能 文章转载自 开源中国社区 [http://www.oschina.net]

数据持久层 jdorm 1.1.1 orm 框架

数据持久层 jdorm1.1 orm 框架 是基于jdbc 而成的框架,jdorm 1.1.1 版本新增spring 类似支持的事务,扩展了编程式事务,性能超越ibatis. 文章转载自 开源中国社区 [http://www.oschina.net]

Hibernate 5.0.14 发布,数据持久层框架

Hibernate 5.0.14 发布了. Hibernate 是一种 Java 语言下的对象关系映射解决方案. 它是使用 GNU 宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hibernate 也是目前 Java 开发中最为流行的数据库持久层框架,现已归 JBOSS 所有. 更新内容请参考提交记录. 下载地址 Source code (zip) Source code (tar.gz) 文章转载自 开源中国社区[https

持续集成之路——数据访问层的单元测试

        翻看之前的文章才发现,最近一次记录持续集成竟然是3年前,并且只记录了两篇,实在是惭愧.不过,持续集成的这团火焰却始终在心中燃烧,希望这次的开始可以有些突破.          测试是持续集成的基石,没有测试的集成基本上是毫无意义的.如何写好测试就是横亘在我面前的第一个问题.那就从数据访问层开始吧.说起来可笑,从3年前第一次准备做持续集成式,就开始考虑测试数据访问层的一些问题: 难道我要在测试服务器上装一个MySQL? 数据库结构发生了变化怎么办? 怎么样才能消除测试间的依赖? 测

持续集成之路——数据访问层的单元测试(续)

        在上一篇中,完成了对测试用数据源的配置.下面继续构建可运行的测试.        三.使用DBUnit管理数据         测试的维护一直是我比较头疼的问题,期望可以有一个比较易于维护和可复用的方法来管理这些数据.在没有更好的方法之前,暂时选用DBUnit.(反思:其实我一直在为没有发生的事情担心,使得事情根本没有进展.从已存在的.最简单的地方入手,才是正确的处理方式.)         在pom.xml中引入dbunit和springtestdbunit包,后者提供通过注解