`

享受单元测试带来的福利——遗留系统维护随感

阅读更多

     今天客户电话过来,说以前箱重自动分配算法有问题,有一只箱子分配的重量过重,导致箱子在海关被扣下了。

 

     代码是两年多以前写的,一开始有点蒙,当年写的代码时的上下文都已经忘记了。幸好当初把这些自动分配的逻辑都封装在一个类里面,而且我还记得这个类的名字。

 

     翻了翻,单元测试用例也还在。算法实现代码的逻辑已经有些看不懂了,幸好我还记得大概的思路,注释写的还算简单明确。翻了一会代码,发现对一个方法的意义不明,我的命名应该说还是可以的。经过几分钟的摸索,这个方法的意义逐渐明确了,真后悔,当初对一些bean属性没有做注释。

 

    这些帮助我暂时复原了当时的场景, 基本上是从磁带里加载到我的大脑的。接下来,是要准备测试数据,利用发现问题的测试数据,把测试用例跑起来。点击右键Run As JUnit,一个深红色的条出现了。我知道,这肯定是代码里有访问数据库的代码,而数据库有没起来,加载spring bean时出错了。首先要找到这部分代码,我没办法了,只能debug了。我认为,debug是万不得已才用的,很多开发人员全是用debug也不脸红。跟踪了几次,终于发现这部分代码,感叹一下代码写的真不咋地。看了一下,把这部分代码暂时屏蔽掉了。再Run,那条终于绿了,真爽啊。

 

    使用测试的数据,我发现,确实如客户所说,一个箱子分配了31吨。虽然没有超出最大重量40吨,但是其它的箱子都是7,8吨,所以这个箱子被扣了。试着把上限改为30吨,这次还好,最大的一个24吨,但还不是很均衡。我突然想到,可能是最大限制弄错了,稍后的阅读代码,证明了我的直觉。改了这一行代码,将新的测试数据和老的测试数据集成了一下,又Run了一下,发现都绿了。

 

     接下来是将修改代码提交到svn仓库的问题,因为,我修改代码期间修改了其它的部分(如果是一个被把代码修改好的快乐冲昏头的程序员,马上commit,可能会把脏代码一起check in,可能会引起bug)。 同时,我也发现以前的代码格式有些问题,有些地方空了很多行,有些在if下单行的语句体没有加{}。可能是程序员完美的心态,我把这些都改过来了。后来我把本地代码和仓库里的代码比对了一下,发现修改了很多,很乱,没法确认修改了哪些地方,包括逻辑和格式。这时,我想到了另一个修改遗留代码的原则,那就是不要修改已经可以正常工作的代码 。我把这个文件中的代码拷贝出来,然后svn上的最新文件强制更新本地文件。之后,把我要修改的那一行放了上去。当然,放上去之前,又测试了一下,发现还是绿的,这下算放心了(我发现我可能有强迫症)。

 

    我已经在开始享受单元测试带来的福利了。俗话说,前人栽树,后人乘凉,希望每个程序员都能养成写单元测试的习惯,不是每个逻辑都一定要写单元测试,但复杂的逻辑和算法一定要写。今天就栽树吧,即使明天乘凉的可能是别的程序员,但你已经为整个程序员社区营造了良好的环境,而不是你离职前留下的半成品垃圾让后来的我们的同行门受苦。

 

    一棵树仿佛就是一个标杆,下面的树根深植在code base里,而上面是我门可见的,让我们记得当时是什么样的情况。

 

    不管测试先行还是测试后行,关键是要写测试。

 

    assertTrue(You understand it!);

2
0
分享到:
评论
1 楼 mingo 2008-12-22  
还没享受到这样的幸福

相关推荐

    遗留系统重构与维护

    遗留系统重构与维护,火龙果软件课程讲义,着重介绍软件维护思想

    .NET单元测试艺术 中文版 PDF版

    第1章 单元测试的基本知识 3 第2章 第一个单元测试 21 第ii部分 核 心 技 术 第3章 使用桩对象解除依赖 49 第4章 用模拟对象做交互测试 83 第5章 隔离(模拟对象)框架 101 第iii部分 测试的代码 第6章 测试...

    .NET单元测试艺术PDF中文版.rar

    《.NET单元测试艺术》针对这个重要主题展开讨论,引导读者从简单的测试开始,逐渐过渡到如何写出可维护、可读、可信赖的测试。同时,还涉及mock,stub和框架(如Typemock Isolator和Rhino Mocks)等高级主题,旨在帮助读者...

    以自动化测试撬动遗留系统

    面对遗留系统,选择合适的测试策略,能让自动化测试的投入在一定时期内看到效果,并且建立可持续进行的机制。同为自动化测试,每种测试在面对遗留系统时遇到的挑战是不同的,起到的效果也不尽相同。 背景我目前所...

    基于V模型的单元测试,集成测试,系统测试

    基于V模型,针对详细设计的单元测试  1)为什么要进行单元测试:  系统测试是一种黑盒测试,也就是不需要了解系统内部结构,只关心外部实现,那么这样发现的问题将不会太彻底,而单元测试是一种白盒测试,只有深入...

    处理遗留系统

    处理遗留系统

    遗留系统SOA迁移解决方案

    遗留系统SOA迁移解决方案,经受过实战检验的好方案

    .NET单元测试艺术(The Art of Unit Testing)

    《.NET单元测试艺术》针对这个重要主题展开讨论,引导读者从简单的测试开始,逐渐过渡到如何写出可维护、可读、可信赖的测试。同时,还涉及mock,stub和框架(如Typemock Isolator和Rhino Mocks)等高级主题,旨在帮助...

    以自动化测试撬动维护阶段的遗留系统

    以自动化测试撬动维护阶段的遗留系统!面对遗留系统,选择合适的测试策略,能让自动化测试的投入在一定时期内看到效果,并且建立可持续进行的机制。同为自动化测试,每种测试在面对遗留系统时遇到的挑战是不同的,起...

    论文研究-历史遗留测试系统的分布式开发策略.pdf

    提出了利用中间件技术对历史遗留测试系统进行分布式开发的策略:对计算机配置高的历史遗留测试系统,结合其特点探索出了一种高效率、高性能的基于CORBADCOM的分布式开发方案;针对数控测试系统,则巧妙利用数据库...

    全面介绍单元测试

    只进行了临时单元测试的软件,针对代码的测试很不完整,代码覆盖率要超过70%都很困难,未覆盖的代码可能遗留大量的细小的错误,这些错误还会互相影响,当BUG暴露出来的时候难于调试,大幅度提高后期测试和维

    有效使用Mock编写java单元测试

    Java单元测试对于开发人员质量保证至关重要,尤其当面对一团乱码的遗留代码时,没有高覆盖率的单元测试做保障,没人敢轻易对代码进行重构。然而单元测试的编写也不是一件容易的事情,除非使用TDD方式,否则编写出...

    一种Java遗留系统服务化切分和封装方法

    一种Java遗留系统服务化切分和封装方法

    改善Java遗留系统的8个技巧

    技巧1:使用分析器  分析器提供了任何其他工具无法提供的功能,从而能够深入检查你的应用。如果你的应用已经有一年多时间没有被分析过了,那么它肯定会有大块大块的低效代码,潜伏在某个黑暗的角落。...

    遗留煤柱群链式失稳的关键柱理论及其应用展望

    研究结果表明:(1)遗留煤柱内在物理力学性质和外在环境因素等的差异性,导致采场遗留煤柱群呈现出最弱失稳致灾模式——遗留煤柱群体系中任一失稳致灾模式发生时,最弱失稳致灾模式必然已经发生,即遗留煤柱群体系...

    可视化的遗留系统微服务改造(54页).pdf

    可视化的遗留系统微服务改造(54页).pdf

    视频监控系统维护记录表.docx

    视频监控系统维护记录表全文共1页,当前为第1页。视频监控系统维护记录表全文共1页,当前为第1页。视频监控系统维护记录表 视频监控系统维护记录表全文共1页,当前为第1页。 视频监控系统维护记录表全文共1页,当前...

Global site tag (gtag.js) - Google Analytics