模塊間建鏈?zhǔn)栴}的分析及解決
很長時(shí)間以來,我每天花在地鐵上的時(shí)間都在一個(gè)小時(shí)以上。閑來無事,我就在手機(jī)上下載了多看閱讀,并且購買了很多電子書。最近,我閱讀了《異類》,頗有感觸。作者在書中提出了一個(gè)“一萬小時(shí)”的定律,也就是說,當(dāng)一個(gè)人花在某件事情上的時(shí)間超過一萬個(gè)小時(shí)之后,就會發(fā)生質(zhì)的改變,就會做到比絕大多數(shù)人好。我們耳熟能詳?shù)囊恍┨觳牛裆w茨、喬伊等等,雖然天賦很高,但自身也很勤奮,花了比常人多得多的時(shí)間在自己所喜歡的事業(yè)上。也就說是,是“一萬小時(shí)”定律讓他們與眾不同。
量變引起質(zhì)變的規(guī)律也適用于軟件開發(fā)領(lǐng)域,本文中提到的問題,即是一例。
問題描述
在某項(xiàng)目進(jìn)行了長期的自動測試工作之后,我們組建了如下的系統(tǒng)架構(gòu):
最近,在進(jìn)行自動測試的過程中,我們發(fā)現(xiàn)測試用例的執(zhí)行總是失敗的。更具體地說,就是消息觸發(fā)腳本無法調(diào)用發(fā)消息工具,兩者之間無法建鏈。
原因分析
本測試系統(tǒng)已搭建了長達(dá)兩年,已經(jīng)累積了上千個(gè)測試用例。之前從未遇到過此類消息觸發(fā)腳本無法調(diào)用發(fā)消息工具的問題。那么,究竟是什么原因引起的呢?
我們首先檢查了自動測試環(huán)境,發(fā)現(xiàn)一切正常。之后,我們修改了自動測試的調(diào)用腳本,變成了手動觸發(fā)。也就是說,當(dāng)發(fā)消息工具成功啟動之后,我們再點(diǎn)擊消息觸發(fā)腳本,發(fā)現(xiàn)鏈路能夠正常建立,且消息發(fā)送正常。那么,為什么自動測試的時(shí)候就不能正常建鏈呢?
我們再回過頭來分析了一下自動測試的整個(gè)流程。當(dāng)自動測試啟動之后,消息觸發(fā)腳本和發(fā)消息工具幾乎是同時(shí)開始運(yùn)行的,而發(fā)消息工具運(yùn)行起來之后,要先讀取配置文件中的測試用例,然后綁定IP和端口號,完成之后再等待和消息觸發(fā)腳本建鏈。前期的測試用例比較少,所有當(dāng)消息觸發(fā)腳本監(jiān)測與發(fā)消息工具的鏈路的時(shí)候,后者已經(jīng)成功讀取了配置文件,并綁定了IP和端口號。這樣,后續(xù)的流程就能夠正常執(zhí)行。
但是,隨著測試用例的累積,當(dāng)消息觸發(fā)腳本開始監(jiān)測與發(fā)消息工具的鏈路的時(shí)候,后者還在讀取配置文件,并未綁定IP和端口號。這樣,消息觸發(fā)腳本發(fā)現(xiàn)鏈路還不具備,因此執(zhí)行就失敗了。這也就是我們看到的現(xiàn)象。之所以手動能夠執(zhí)行成功,是因?yàn)槲覀凕c(diǎn)擊消息觸發(fā)腳本的時(shí)候,發(fā)消息工具早就完成了讀配置和綁定IP與端口號的操作(手動操作要比自動操作慢很多),就不存在建鏈不成功的問題了。
問題解決
根據(jù)以上分析,我們只需要給發(fā)消息工具足夠的時(shí)間,讓消息觸發(fā)腳本晚點(diǎn)與發(fā)消息工具建鏈就可以了。
我們在消息觸發(fā)腳本中添加了如下語句:
- ping 127.0.0.1 -n 30
當(dāng)消息觸發(fā)腳本執(zhí)行了30次ping操作之后,發(fā)消息工具早就做好了準(zhǔn)備工作,于是建鏈成功,后續(xù)流程順利執(zhí)行。
總結(jié)
本文中提到的建鏈?zhǔn)栴}的解決辦法雖然簡單,但該問題卻提醒了我們,在兩個(gè)模塊需要進(jìn)行消息交互的時(shí)候,發(fā)送消息的模塊一定要等到接收消息的模塊“準(zhǔn)備好”之后,再發(fā)送消息過去。也就說是,軟件模塊的初始化需要時(shí)間,在設(shè)計(jì)軟件的時(shí)候,我們一定要將各個(gè)模塊的初始化時(shí)間考慮進(jìn)去。
【本文是51CTO專欄作者周兆熊的原創(chuàng)文章,作者微信公眾號:周氏邏輯(logiczhou)】