很长时间以来,我每天花在地铁上的时间都在一个小时以上。闲来无事,我就在手机上下载了多看阅读,并且购买了很多电子书。最近,我阅读了《异类》,颇有感触。作者在书中提出了一个“一万小时”的定律,也就是说,当一个人花在某件事情上的时间超过一万个小时之后,就会发生质的改变,就会做到比绝大多数人好。我们耳熟能详的一些天才,像盖茨、乔伊等等,虽然天赋很高,但自身也很勤奋,花了比常人多得多的时间在自己所喜欢的事业上。也就说是,是“一万小时”定律让他们与众不同。
量变引起质变的规律也适用于软件开发领域,本文中提到的问题,即是一例。
问题描述
在某项目进行了长期的自动测试工作之后,我们组建了如下的系统架构:
最近,在进行自动测试的过程中,我们发现测试用例的执行总是失败的。更具体地说,就是消息触发脚本无法调用发消息工具,两者之间无法建链。
原因分析
本测试系统已搭建了长达两年,已经累积了上千个测试用例。之前从未遇到过此类消息触发脚本无法调用发消息工具的问题。那么,究竟是什么原因引起的呢?
我们首先检查了自动测试环境,发现一切正常。之后,我们修改了自动测试的调用脚本,变成了手动触发。也就是说,当发消息工具成功启动之后,我们再点击消息触发脚本,发现链路能够正常建立,且消息发送正常。那么,为什么自动测试的时候就不能正常建链呢?
我们再回过头来分析了一下自动测试的整个流程。当自动测试启动之后,消息触发脚本和发消息工具几乎是同时开始运行的,而发消息工具运行起来之后,要先读取配置文件中的测试用例,然后绑定IP和端口号,完成之后再等待和消息触发脚本建链。前期的测试用例比较少,所有当消息触发脚本监测与发消息工具的链路的时候,后者已经成功读取了配置文件,并绑定了IP和端口号。这样,后续的流程就能够正常执行。
但是,随着测试用例的累积,当消息触发脚本开始监测与发消息工具的链路的时候,后者还在读取配置文件,并未绑定IP和端口号。这样,消息触发脚本发现链路还不具备,因此执行就失败了。这也就是我们看到的现象。之所以手动能够执行成功,是因为我们点击消息触发脚本的时候,发消息工具早就完成了读配置和绑定IP与端口号的操作(手动操作要比自动操作慢很多),就不存在建链不成功的问题了。
问题解决
根据以上分析,我们只需要给发消息工具足够的时间,让消息触发脚本晚点与发消息工具建链就可以了。
我们在消息触发脚本中添加了如下语句:
- ping 127.0.0.1 -n 30
当消息触发脚本执行了30次ping操作之后,发消息工具早就做好了准备工作,于是建链成功,后续流程顺利执行。
总结
本文中提到的建链失败问题的解决办法虽然简单,但该问题却提醒了我们,在两个模块需要进行消息交互的时候,发送消息的模块一定要等到接收消息的模块“准备好”之后,再发送消息过去。也就说是,软件模块的初始化需要时间,在设计软件的时候,我们一定要将各个模块的初始化时间考虑进去。
【本文是51CTO专栏作者周兆熊的原创文章,作者微信公众号:周氏逻辑(logiczhou)】