InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

测试:开发人员理想与现实的大PK

作者 Jonathan Allen 译者 王速瑜 发布于 2008年11月11日

领域
过程 & 实践,
语言 & 开发
主题
.NET ,
单元测试 ,
编程 ,
敏捷 ,
测试驱动开发 ,
测试

PDC大会上进行了关于“单元测试的未来”的小组讨论,大部分的谈话内容聚焦于Mock测试,人们对于Mock 框架(Mock frameworks)的过度使用取得了普遍共识。

共识如下:通常,实现所有必要的接口非常无聊,而且消耗时间。为了更方便,人们选择了Mock 框架。但这遮盖了更本质的问题:API被设计得过于复杂。

关于“开发人员测试”与其他人员的测试之间的区别,有一个热门的话题。一直以来的讨论中,人们都认为开发人员只需要做单元测试,而需求测试、验收测试、集成测试,以及所有其他形式的测试都是其他人的工作。

这里强调了在单元测试社区中存在的一个普遍误解。具体来说,就是假设所有开发人员都配备了QA团队,以处理所有其他类型的测试。不幸的是,即使是拥有数百万资金的公司也往往根本没有QA资源,所有的测试都留给了开发人员和最终用户。

开发人员无法进行更多类型测试的主要原因是速度。 单元测试已经太慢了,因此没有更多时间去进行那些更慢的测试了,比如包括网络通信的测试。 遗憾的是,并没有人考虑其他变通之策。

举个例子,单元测试框架其实可以更加智能,它们可以使用代码覆盖率的结果,只对发生变化的代码进行二次测试。一个类的变化,不应该触发重新运行所有的测试集合。所谓“单元测试”意味着你只需测试一个小的子集即可。

另外一种没有被提及的改进是利用分布式编程。代码和测试可以被快速上传到各个服务器并且得到执行。通过引入持续集成,我们已经拥有了所有需要的技术。

早些的讨论普遍觉得数据库方面被忽视了,大部分的数据库开发人员很少或几乎没有单元测试的概念,也缺乏相关支持工具。更可怕的是,他们甚至都没有被邀请来参加讨论。遗憾的是这就是目前的现状。讨论中也没有提供方法改善这些现实问题。

从好的方面看,已经有一些人在讨论使用建模工具来让单元测试更加简单。他们提供了很多可选的办法,例如从定义契约级别开始。这些契约可以被代码生成器用来编写实际的测试代码。显然,这并非一个100%完美的解决方案,但它能够减少经常遇到的困难。

另一个被看好的办法是采用delta状态管理。设想测试“取钱”这个功能,很多人会假设被测试帐户最开始有100美元,经过交易后,剩下80美元。这个方法就是首先查询一下账号余额,然后再看是否减少了20美元。这样一来,就不必在每次运行测试时都重新设置测试环境了。

查看英文原文:Testing: What Developers Are Expected To Do Versus What They Actually Do


译者简介:王速瑜,毕业于华中科技大学,就职于腾讯科技(深圳)有限公司,担任R&D研发总监,现负责腾讯敏捷产品开发技术的实践和推广及研发基础平台的管理工作。熟悉Java、Microsoft.net、Lamp等技术。对互联网大规模应用技术、高性能网格技术,SOA等有非常浓厚的兴趣和深入的实践,喜欢Open Source,关注Ruby、Erlang的发展并积极实践,愿意为技术而挥洒激情,为让更多人了解精彩技术而付出努力!志愿参与InfoQ中文站内容建设,请邮件至editors@cn.infoq.com。也欢迎大家到InfoQ中文站用户讨论组参与我们的线上讨论。

敏捷的其他实践可以弥补一些问题 发表人 Song Sam 发表于
推荐一个非常好用的数据库单元测试工具 发表人 harry har 发表于
  1. 返回顶部

    敏捷的其他实践可以弥补一些问题

    发表人 Song Sam

    笔者已经提到的持续集成可以将一部分测试转移到集成机器上实行
    单元测试也是可以分组的啊,TestSuite就是这样的概念,看来单元测试也已经到了需要专门对它进行组织的阶段了。

  2. 返回顶部

    推荐一个非常好用的数据库单元测试工具

    发表人 harry har

    关于数据库的单元测试, 我想推荐AnyDbTest, 官网是www.AnyDbTest.com, 它的Express版软件是免费的.

    在以前的项目中, 我尝试了很多的单元测试框架, 比如NUnit和DbUnit, 在很大程度上讲, 它们其实是编程平台, 而不是即插即用的工具, 它们需要你编写Java或.Net程序. 它们适合App developer, 但并不适合DB developer和DBA.

    AnyDbTest专为DBA和DB developer设计, 你只需要编写一个简单的Xml文件, 在Xml文件中, 告诉AnyDbTest你要测试什么, 你期望的结果应该是什么就可以了. 在测试完成之后, AnyDbTest会呈现出一排红绿灯, 显式红的测试Case是没有满足你期望的, 而绿色的测试Case符合你期望的Case.

    Feature:
    1. 使用Xml编写测试用例, 不需要懂Java或其他编程语言.
    2. 不需要在Db Server端安装任何package或软件.
    3. 支持多种数据库 (目前支持Oracle/Sql Server/MySQL/Excel数据库, 将来会支持更多的数据库)
    4. 支持多达21种测试断言(Assertion), 比如两个记录集合相等, 两个记录集合严格相等, 一个是另一个的子集, 超集等
    5. 可以使用Excel作为测试用例的数据源. 这样你准备测试数据将非常容易
    6. 支持分布式数据库单元测试, 也就是说你不仅仅可以测试单一的数据库上的脚本, 而且可以利用一个数据库的数据, 来测试另一个数据库脚本.
    7. 支持沙箱模型. 只要你的数据库本身支持事务, 你可以将测试用例设置为沙箱测试模式, 等测试完毕之后, 所有的数据库语句将会自动被会滚.
    8. 提供专有的记录集的比较功能. 比如当我们发现某个测试用例不通过的时候, 可以使用这些记录集比较功能, 看看期望的记录集与实际的记录集相比, 到底多一些什么, 或少了一些什么.