`

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

阅读更多

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

    单元测试说明模板

    在本文档中,我们将详细地介绍单元测试的设计规格和测试用例规格,以便为XX项目的单元测试活动提供指导。单元测试设计规格将包括需要测试的类、测试使用的模型、针对每个类的测试策略以及所需执行的测试用例等。 在...

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

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

    单元测试实例(C#版)

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

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

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

    Android单元测试的小例子

    8. **Testing Best Practices**:编写单元测试时,遵循一些最佳实践很重要,比如“测试单一职责”(每个测试方法只测试一个功能)、“先写测试再写代码”(TDD,Test-Driven Development)以及保持测试可读性和可...

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

    通过这份报告,我们可以看到单元测试的全面性和深度,它不仅提供了测试结果,还揭示了项目开发过程中的问题,为后续的优化和改进提供了依据。此外,使用VS2005进行检查,表明了对自动化测试和代码质量监控的重视,这...

    Struts2SpringUnitDemo单元测试

    Struts2SpringUnitDemo是一个示例项目,展示了如何在Java应用程序中将Struts2和Spring框架进行集成,并进行单元测试。这两个框架都是Java Web开发中的关键组件,Struts2负责控制层逻辑,Spring则提供了全面的依赖...

    在java中使用 junit单元测试

    例如,如果我们写了一个类,这个类包含多个方法,我们可以使用单元测试框架来测试每个方法是否正确。 JUnit单元测试框架 JUnit是Java中最流行的单元测试框架之一。它提供了丰富的API,帮助我们快速地编写单元测试...

    JUnit单元测试原则 单元测试工具

    ### JUnit单元测试原则与工具详解 #### 一、单元测试概述 单元测试(Unit Testing)是一种软件测试方法,主要用于验证程序中的最小可测试单元(通常是单个函数或方法)是否按预期工作。对于Java这样的面向对象语言来...

    SpringBoot 多模块 Serivce 层单元测试

    进行Service层的单元测试,我们主要关注以下几个方面: 1. **测试环境配置**:在IDEA中,我们可以利用Maven或Gradle的生命周期插件来构建测试环境。对于Spring Boot项目,通常会使用`spring-boot-starter-test`依赖...

    Servlet Filter 的单元测试

    进行单元测试时,我们可以使用JUnit作为测试框架,Mockito来模拟依赖对象,以及PowerMock等库来模拟静态方法和构造函数,以便于测试Filter的各个部分。同时,为了模拟Servlet容器环境,可能还需要使用如Tomcat ...

    对WinForm进行单元测试的例子(使用NUnitForms)

    通过NUnitForms,我们可以有效地对WinForm中的控件行为和对话框逻辑进行单元测试,提高代码质量。 至于`ClassLibrary1`,它可能包含了WinForm应用程序所依赖的服务或者业务逻辑。这些类库同样需要进行单元测试,但...

    如何使用VSTS写单元测试

    下面我们将详细介绍如何使用VSTS进行单元测试。 ### 1. 创建VSTS项目 首先,你需要在VSTS(现Azure DevOps Services)上创建一个新的项目。登录到你的VSTS账户,选择“新建项目”,并提供项目名称、描述以及默认的...

    轻松编写 C++ 单元测试(gtest)

    在本文中,我们会聚焦于C++语言的单元测试实现,特别是通过Google提供的开源单元测试框架——gtest(又称googletest),来演示如何编写有效的单元测试。 首先,我们需要理解单元测试的定义。单元测试是一种测试方法...

    单元测试规范详细说明

    对于这类方法,单元测试不仅要关注其功能实现,还要考虑异常处理的情况。 5. **外部系统交易类方法/配置文件读写类方法**:这些方法涉及到与其他系统的交互或者配置文件的读写,因此需要确保它们能够在各种情况下...

Global site tag (gtag.js) - Google Analytics