今天客户电话过来,说以前箱重自动分配算法有问题,有一只箱子分配的重量过重,导致箱子在海关被扣下了。
代码是两年多以前写的,一开始有点蒙,当年写的代码时的上下文都已经忘记了。幸好当初把这些自动分配的逻辑都封装在一个类里面,而且我还记得这个类的名字。
翻了翻,单元测试用例也还在。算法实现代码的逻辑已经有些看不懂了,幸好我还记得大概的思路,注释写的还算简单明确。翻了一会代码,发现对一个方法的意义不明,我的命名应该说还是可以的。经过几分钟的摸索,这个方法的意义逐渐明确了,真后悔,当初对一些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!);
分享到:
相关推荐
遗留系统维护通常需要关注以下几个方面: 1. 性能优化:随着系统运行时间的增长,性能问题可能会逐渐显现,需要对数据库查询、文件IO、算法效率等方面进行优化。 2. 安全性修复:对系统进行安全漏洞扫描和修复,增强...
单元测试是软件开发过程中的一种测试方法,它主要关注软件中最小可测试部分——单元的功能和逻辑实现。单元测试的目的是验证每个独立的单元是否符合设计和功能要求,以确保每个部分的代码都能高质量、高效率地运行。...
这份"单元测试报告模板"提供了系统化的方法来记录和评估单元测试的过程和结果,确保软件的质量和稳定性。 首先,报告应包含产品的基本信息,如产品名称、部门、版本号、语言、开发和测试工具以及测试人员,这些信息...
第1章 单元测试的基本知识 3 第2章 第一个单元测试 21 第ii部分 核 心 技 术 第3章 使用桩对象解除依赖 49 第4章 用模拟对象做交互测试 83 第5章 隔离(模拟对象)框架 101 第iii部分 测试的代码 第6章 测试...
无论是通过使用分析器深入检查应用,还是通过自动化构建和部署简化开发流程,或是通过创建单元测试提高代码质量,每一步都对提升遗留系统的稳定性和可维护性至关重要。同时,监控数据库使用状况、利用JMX增强运维...
《.NET单元测试艺术》针对这个重要主题展开讨论,引导读者从简单的测试开始,逐渐过渡到如何写出可维护、可读、可信赖的测试。同时,还涉及mock,stub和框架(如Typemock Isolator和Rhino Mocks)等高级主题,旨在帮助读者...
【使用Cobertura统计单元测试覆盖率】 在软件开发过程中,单元测试是确保代码质量的重要环节。它能够帮助我们发现潜在的错误,提高代码的可维护性。然而,仅仅编写单元测试是不够的,我们还需要知道这些测试覆盖了...
在软件工程领域,遗留系统通常指那些已经存在多年、缺乏文档记录、技术陈旧且难以维护的系统。随着业务需求的不断变化和技术的快速发展,如何有效地对这些遗留系统进行现代化改造,以适应新的业务场景和提高系统的可...
- **降低维护成本**:良好的单元测试覆盖率可以减少后期维护中的调试工作量。 2. **单元测试流程** - **编写测试用例**:根据需求和代码逻辑,设计能够覆盖各种输入和边界条件的测试用例。 - **运行测试**:使用...
综上所述,对于那些希望克服遗留系统带来的挑战、加速数字化转型的企业来说,SOA提供了一个有力的工具箱。通过精心规划和实施SOA解决方案,不仅可以解决当前的问题,还能为未来的持续发展打下坚实的基础。
基于V模型,针对详细设计的单元测试 1)为什么要进行单元测试: 系统测试是一种黑盒测试,也就是不需要了解系统内部结构,只关心外部实现,那么这样发现的问题将不会太彻底,而单元测试是一种白盒测试,只有深入...
在进行单元测试时,良好的测试实践包括编写独立的测试(每个测试不应依赖于其他测试的结果)、保持测试的隔离性(每个测试应能独立运行而不影响其他测试),以及编写有意义的测试名称,以便于理解和维护。...
遗留系统通常指的是那些早期开发且在后期维护中不断添加新功能,但未进行适时结构性更新的系统。这类系统由于历史遗留问题,往往会存在代码复杂、耦合度高、难以扩展及维护困难等问题,因此重构的需求就显得尤为迫切...
以自动化测试撬动维护阶段的遗留系统!面对遗留系统,选择合适的测试策略,能让自动化测试的投入在一定时期内看到效果,并且建立可持续进行的机制。同为自动化测试,每种测试在面对遗留系统时遇到的挑战是不同的,起...
根据给定的文件信息,我们可以提炼出一系列与IT行业,特别是Java编程相关的知识点,这些知识点不仅涵盖了软件开发过程中的重要环节——单元测试,还涉及了软件工程中的文档编写规范、测试策略以及问题追踪等关键领域...
提出了利用中间件技术对历史遗留测试系统进行分布式开发的策略:对计算机配置高的历史遗留测试系统,结合其特点探索出了一种高效率、高性能的基于CORBADCOM的分布式开发方案;针对数控测试系统,则巧妙利用数据库...
测试版本准出条件与DI值规则 一、DI值定义 在软件测试中,DI值(Defect Index)是一种衡量软硬件质量高低的指标。DI值是根据测试活动发现的缺陷按照问题的严重程度分为四个等级,包括致命、严重、一般、轻微。通过...