`

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

阅读更多

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

 

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

 

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

相关推荐

    遗留系统重构与维护

    遗留系统维护通常需要关注以下几个方面: 1. 性能优化:随着系统运行时间的增长,性能问题可能会逐渐显现,需要对数据库查询、文件IO、算法效率等方面进行优化。 2. 安全性修复:对系统进行安全漏洞扫描和修复,增强...

    C&C++单元测试培训

    单元测试是软件开发过程中的一种测试方法,它主要关注软件中最小可测试部分——单元的功能和逻辑实现。单元测试的目的是验证每个独立的单元是否符合设计和功能要求,以确保每个部分的代码都能高质量、高效率地运行。...

    单元测试报告模板

    这份"单元测试报告模板"提供了系统化的方法来记录和评估单元测试的过程和结果,确保软件的质量和稳定性。 首先,报告应包含产品的基本信息,如产品名称、部门、版本号、语言、开发和测试工具以及测试人员,这些信息...

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

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

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

    无论是通过使用分析器深入检查应用,还是通过自动化构建和部署简化开发流程,或是通过创建单元测试提高代码质量,每一步都对提升遗留系统的稳定性和可维护性至关重要。同时,监控数据库使用状况、利用JMX增强运维...

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

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

    使用Cobertura统计单元测试覆盖率

    【使用Cobertura统计单元测试覆盖率】 在软件开发过程中,单元测试是确保代码质量的重要环节。它能够帮助我们发现潜在的错误,提高代码的可维护性。然而,仅仅编写单元测试是不够的,我们还需要知道这些测试覆盖了...

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

    在软件工程领域,遗留系统通常指那些已经存在多年、缺乏文档记录、技术陈旧且难以维护的系统。随着业务需求的不断变化和技术的快速发展,如何有效地对这些遗留系统进行现代化改造,以适应新的业务场景和提高系统的可...

    软件测试单元测试实验报告.docx

    - **降低维护成本**:良好的单元测试覆盖率可以减少后期维护中的调试工作量。 2. **单元测试流程** - **编写测试用例**:根据需求和代码逻辑,设计能够覆盖各种输入和边界条件的测试用例。 - **运行测试**:使用...

    遗留系统SOA迁移解决方案

    综上所述,对于那些希望克服遗留系统带来的挑战、加速数字化转型的企业来说,SOA提供了一个有力的工具箱。通过精心规划和实施SOA解决方案,不仅可以解决当前的问题,还能为未来的持续发展打下坚实的基础。

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

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

    nunit单元测试视频教程(4/6)

    在进行单元测试时,良好的测试实践包括编写独立的测试(每个测试不应依赖于其他测试的结果)、保持测试的隔离性(每个测试应能独立运行而不影响其他测试),以及编写有意义的测试名称,以便于理解和维护。...

    iOS遗留系统上的架构重构 李剑.pdf

    遗留系统通常指的是那些早期开发且在后期维护中不断添加新功能,但未进行适时结构性更新的系统。这类系统由于历史遗留问题,往往会存在代码复杂、耦合度高、难以扩展及维护困难等问题,因此重构的需求就显得尤为迫切...

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

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

    测试文档模板

    根据给定的文件信息,我们可以提炼出一系列与IT行业,特别是Java编程相关的知识点,这些知识点不仅涵盖了软件开发过程中的重要环节——单元测试,还涉及了软件工程中的文档编写规范、测试策略以及问题追踪等关键领域...

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

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

    测试版本准出条件与DI值规则20230302

    测试版本准出条件与DI值规则 一、DI值定义 在软件测试中,DI值(Defect Index)是一种衡量软硬件质量高低的指标。DI值是根据测试活动发现的缺陷按照问题的严重程度分为四个等级,包括致命、严重、一般、轻微。通过...

Global site tag (gtag.js) - Google Analytics