`

为什么我们要写单元测试?

阅读更多

      今天下午下班前,退款流程改造项目,前台的开发人员觉得现有的流程有个地方不合理:在退款并退货又拒绝退货情况下,如果按照现有流程开发,会让前台界面控制比较麻烦,并且业务上来看也不太合理,大家在一起开了一个会,他们问TC能否把这个流程改造下。

      TC使用改造后的JBPM控制退款流程的流转,退款流程去年9月上线后就没有再动过,JBPM相关的代码最初不是我写的,我对里面的配置已经比较陌生了,另外发布日期也快了,在这个项目的尾期,是否还需要接受需求,做比较大的修改,更重要的是,修改后的代码,是不能影响已有的业务逻辑,不能出任何的问题。

      我仔细的想了想,首先觉得业务上这个需求是合理的,再想了想需要注意的几个点,好像能够控制,决定接下这个需求。


      吃完晚饭回来,翻了RefundServiceBuyerModifyAgreement开头的单元测试,还好,常见的3种业务场景覆盖了2种,异常流覆盖了3种。我根据新的业务场景补了一个单元测试用例,把有修改的几个点加上Assert,然后开始改代码。加Decision节点,加Process Transition,修改JBPM配置文件,按照新的流程加了一个新的路径,然后改了业务代码,并增加一个Dao方法满足新的需求。

      在这个过程中,发生一个小插曲,我运行了一遍单元测试,本来期望会抛出一个异常(业务代码还没实现),没想到居然看到绿条,突然想起,我只是修改了正式环境的配置文件,没有修改单元测试环境的配置文件,它还是走的老流程。打开Total Commander,用快捷键进入需要同步的两个配置文件目录,祭出Beyond Compare,同步后,然后去Eclipse F5了几下,果然,这次是期望的红条。

      半个小时后,所有编码完成。为新流程加的单元测试也看到了绿条。我把所有的代码SVN同步后,一次性提交到服务器。

      然后登录到CruiseControl的服务器,cd到为本次改造建立的持续集成项目,svn up后,运行mvn clean test,其间,我还忙里偷闲,拿出今天快递刚到的09年春季福建铁观音,泡了杯好茶。等了3分钟,所有测试都跑完了,挂了3个Case,我在本地Eclipse中跑了下,果然跑不过,然后打开Excel准备的初始化数据,找到出问题那个Case的退款记录和交易记录,开始觉得是:初始化数据的退款状态有问题,改正了后,在Eclipse中F5了几下,再跑,本来期望能见到绿色,还是红色,并且还是抛了一个异常。

      看来是我把以前好的代码改坏了,仔细看了下代码,发现是流程引擎的配置文件的问题:调用这个流程的地方有两个点,而我只改了这次改造相关的一个点。我将剩下的一个点也改了,再跑,果然是绿色。这个错误还是比较隐蔽,如果等到功能测试再发现这个问题,需要我去跟踪,定位,修改,提交,找人重新部署到测试环境,然后再叫功能测试人员去Redo测试,Close BUG,至少需要花两个小时的时间;如果测试遗漏发到线上,那就麻烦了。

      提交前,我发现新建类名有些不合理,使用Eclipse的重构工具,换了个比较容易理解的类名,提交,然后在CruiseControl服务器跑全套单元测试,600多个Case都过了,这次没有问题。

      然后我ssh到我们的149服务器将我这次修改的代码更新,打包,重新部署,发布成服务。我在本地Eclipse中切换到集成测试工程,将集成测试目标服务地址从日常测试环境切换到149服务器,运行全套的集成测试,10分钟后,90多个测试跑完,没问题。我看了看表,还有5分钟到8点。

      

      我想这就是我们为什么要坚持写覆盖全面的单元测试的原因,即使这会花掉我们额外的很多时间。因为: 

  1. 有了这些测试,我们能够知道这次的修改至少不会影响以前的功能。
  2. 可以对代码变化不那么惧怕,对自己代码有信心,才能更好的拥抱变化。
  3. 在开发阶段解决大部分BUG,让开发和测试都更加轻松。

    实际上,单元测试和写说明文档一样,看上去是个花时间,牺牲效率的工作,但是,如果你写了一些代码却完全不知道它会不会正常的Run起来,如果你天天被一群人在旺旺上问这问那,花时间写单元测试绝对是划算的买卖。      




      


分享到:
评论
1 楼 bianku 2009-06-03  
学习了。。。。好费事哦

相关推荐

    程序员为什么不写单元测试?[1]

    程序员为什么不写单元测试?[1]单元测试工具赛门铁克误杀门事件在一片争议声中落下了帷幕,但是它身后隐蔽的问题还远未结束,诺顿误杀彰显测试价值的回归,同时也向广大的程序员们敲响了警钟,不做单元测试的程序员在...

    程序员为什么不写单元测试?[2]

    在这里,我们需要讨论的重点是单元测 程序员为什么不写单元测试?[2] 单元测试工具 一个bug被隐藏的时间越长,修复这个bug的代价就越大。在《快速软件开发》一书中已引用了大量的研究数据指出:最后才修改一个bug...

    灵魂拷问:到底要不要写单元测试,如何正确进行单元测试?.zip

    计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,学习参考资料 计算机技术、IT咨询、人工智能AI理论介绍,...

    单元测试实例(C#版)

    (C#语言版)单元测试实例,主要功能包括:(1)输入数据到textbox,以逗号间隔,然后求数组最大值、求和,并将结果显示出来,并针对于数组求最大值函数和求和函数写单元测试代码;(2)连接数据库,写出单元测试代码来测试求...

    单元测试报告实例,帮助写好单元测试报告

    单元测试报告实例,帮助写好单元测试报告,配合用vs2005进行检查

    如何使用VSTS写单元测试

    如何使用VSTS写单元测试如何使用VSTS写单元测试如何使用VSTS写单元测试如何使用VSTS写单元测试如何使用VSTS写单元测试如何使用VSTS写单元测试

    mockito单元测试使用

    虽然测试分为单元测试,集成测试,系统测试等等,但是作为开发,我们可能不需要做这么多的测试(有时甚至不做……)接下来就说说和开发息息相关的单元测试以及集成测试。 单元测试就是模块测试,我的理解一个模块...

    单元测试的代码覆盖率至少80%

    一大早,一个年轻的程序员问大师:“我准备写一些单元测试用例。代码覆盖率应该达到多少为好?”大师回答道:“不要考虑代码覆盖率,只要写出一些好的测试用例即可。”  一大早,一个年轻的程序员问大师:  “我准备...

    单元测试说明模板

    本文档为XX项目的单元测试活动提供测试设计规格及测试用例规格。文档内容包括了需要测试的类、测试使用的模型、针对每个类的测试策略以及所需执行的测试用例等。

    单元测试实例代码

    (C#语言版)单元测试实例,主要功能包括:(1)输入数据到textbox,以逗号间隔,然后求数组最大值、求和,并将结果显示出来,并针对于数组求最大值函数和求和函数写单元测试代码;(2)连接数据库,写出单元测试代码来测试求...

    Servlet Filter 的单元测试

    Servlet Filter 的单元测试Servlet Filter 的单元测试Servlet Filter 的单元测试Servlet Filter 的单元测试Servlet Filter 的单元测试

    单元测试培训文档.pptx

    文档表达的核心意思:1、我们之前为什么不写单元测试;2、我们现在为什么要写单元测试;3、如何写好单元测试;以及Junit、Mockito、Hamcrest、Dbunit、jacoco等常用测试工具的使用

    Struts2SpringUnitDemo单元测试

    Struts2 Spring 框架整合 单元测试 Action和Service http://blog.csdn.net/fansunion/

    数据库操作的单元测试

    4.1.2. 在运行测试用例的时候,出现SQLException,并且对应的sqlstate:23504,这是为什么? 1 4.2. HSQLDB相关的问题 1 4.2.1. 抛出:java.sql.SQLException: socket creation error 1 4.3. 其他问题 1

    SpringBoot 多模块 Serivce 层单元测试

    IDEA Spring 多模块 Service 层单元测试, 此代码只演示Service层单元测试。。。。。。。。。。。。。。

    Android单元测试初探——Instrumentation

    这几天在物流大赛上也用了不少时间,所以对于android的单元测试没有太深入的研究,所以先写个基本入门吧!首先,我们来了解一下android的测试类的层次结构:可以看出android中的测试方法主要有AndroidTextCase和...

    对ASP.NET MVC项目中的视图做单元测试.txt

     说到ASP.NET MVC,我们似乎始终都在关注对于Controller的测试——虽然Stephen Walther也写过如何脱离Web Server对View进行单元测试,但是他的方法可看而不可用。复杂的构造和预备,以及对生成的HTML字符串作判断...

    单元测试的实践:单元测试要做多细?

    单元测试的实践:单元测试要做多细?这篇文章主要来源是StackOverflow上的一个回答——“Howdeepareyourunittests?”。一个有13.8K的分的人(JohnNolan)问了个关于TDD的问题,这个问题并不新鲜,最亮的是这个问题的...

    c#单元测试例子

    简单例子实现单元测试,教你如何写单元测试,测试私有方法

    软件测试技术JUnit和单元测试入门简介

    JUNIT软件测试软件测试技术JUnit和单元测试入门简介软件测试1、几个相关的概念白盒测试——把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员是公开的。回归测试——软件或环境的修复或更正后...

Global site tag (gtag.js) - Google Analytics