程序健壯性的提高要從設(shè)計(jì)、實(shí)現(xiàn)、測(cè)試三方面入手,具體來(lái)說(shuō)
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
? 作者?|? yuzhenjin
來(lái)源 |? urlify.cn/aQfaem
76套java從入門到精通實(shí)戰(zhàn)課程分享
1. 設(shè)計(jì)
1. 系統(tǒng)
系統(tǒng)外部模塊的異步響應(yīng)都需要設(shè)置超時(shí)時(shí)間,要有超時(shí)處理,超時(shí)時(shí)間要和外部模塊協(xié)商一個(gè)合理時(shí)間。
發(fā)送消息失敗和設(shè)置timer失敗統(tǒng)一做處理。
需要設(shè)計(jì)相關(guān)機(jī)制(比如心跳包機(jī)制)監(jiān)控進(jìn)程/線程是否發(fā)生了堵塞,發(fā)生堵塞后需要設(shè)計(jì)相應(yīng)的處理流程。
需要設(shè)計(jì)相關(guān)機(jī)制來(lái)監(jiān)控CPU的占有率,當(dāng)CPU占有率超過(guò)閾值后要設(shè)計(jì)相應(yīng)的處理流程。
2. 模塊
系統(tǒng)內(nèi)部所有需要等待的異步響應(yīng)都要有超時(shí)處理。
關(guān)聯(lián)組件的行為不一致要做異常處理:比如:APP模塊認(rèn)為通信已經(jīng)斷開(kāi),故不會(huì)再次請(qǐng)求通信MID模塊去執(zhí)行通信,而通信MID模塊等待APP模塊來(lái)觸發(fā)下一次通信。
模塊內(nèi)部暫態(tài)都要設(shè)置最長(zhǎng)停留時(shí)間,以及超過(guò)這個(gè)時(shí)間后做什么樣的處理。
模塊的錯(cuò)誤處理至少要考慮以下幾種類型錯(cuò)誤:
輸入了范圍外的值
在規(guī)定時(shí)間內(nèi),處理沒(méi)有結(jié)束或者沒(méi)有應(yīng)答
與期待的時(shí)序不一致
期待的數(shù)據(jù)不完整:
由錯(cuò)誤轉(zhuǎn)化為異常的判定標(biāo)準(zhǔn):
不以單次Error做判定,而是執(zhí)行一定次數(shù)(3次)的Retry處理。
測(cè)試時(shí)間以大于一定時(shí)間為目標(biāo) 。
通信關(guān)聯(lián)的功能模塊在設(shè)計(jì)時(shí)需要考慮:
用戶異常切斷時(shí)怎么處理
通信正常切斷時(shí)怎么處理
通信正常終了時(shí)怎么處理
設(shè)備異常切斷時(shí)怎么處理"
做狀態(tài)遷移表的設(shè)計(jì)時(shí),如果狀態(tài)遷移表的事件有外部設(shè)備異常切斷的通知。要明確各狀態(tài)下收到該通知時(shí)處理的妥當(dāng)性,并且明確這些設(shè)計(jì)。
需要考慮起動(dòng)處理時(shí)各模塊消息的同步問(wèn)題。例如,優(yōu)先級(jí)高的A模塊啟動(dòng)后,發(fā)送消息給后B模塊,考慮如果此時(shí)B模塊未啟動(dòng)的處理情況。
對(duì)于Backup的數(shù)據(jù),需要考慮Backup各種狀態(tài)下啟動(dòng)之后處理:
1 沒(méi)有讀取到Backup數(shù)據(jù)
2 Backup數(shù)據(jù)為初始值
3 Backup數(shù)據(jù)達(dá)到最大邊界值
4 Backup數(shù)據(jù)超過(guò)最大邊界值或者異常。備份的數(shù)據(jù)要有默認(rèn)值。
備份的數(shù)據(jù)要進(jìn)行完整性校驗(yàn)。
設(shè)計(jì)模塊時(shí),盡量保證此模塊可以有機(jī)制來(lái)恢復(fù)。
模塊出現(xiàn)異常時(shí),有一套機(jī)制可以檢測(cè)出來(lái)。
3. 函數(shù)
輸入范圍之外的值需要做處理。
函數(shù)設(shè)計(jì)時(shí)需要明確設(shè)計(jì)目標(biāo)函數(shù)所調(diào)用函數(shù)的所有返回值。對(duì)正常值以外的返回值進(jìn)行分析,分析不同的返回值是否需要做不同的異常處理。并且明確這些異常設(shè)計(jì)。
Loop循環(huán),一定要設(shè)定跳出循環(huán)的條件或者是范圍的判定。
進(jìn)行數(shù)據(jù)的格式轉(zhuǎn)換的處理,需要明確:1 數(shù)據(jù)轉(zhuǎn)換前后的格式2 轉(zhuǎn)換規(guī)則3 是否有數(shù)據(jù)在轉(zhuǎn)換時(shí)需要特殊處理,比如邊界值。
2. 實(shí)現(xiàn)
不允許使用C語(yǔ)言中非安全的經(jīng)典函數(shù),如下:
strcpy/wcscpy/stpcpy/ wcpcpy
scanf/ sscanf /vscanf /fwscanf /swscanf/ wscanf
gets/ puts
strcat /wcscat
wcrtomb /wctob
sprintf/ vsprintf /vfprintf
asprintf/ vasprintf
strncpy /wcsncpy
strtok/ wcstok
代碼滿足靜態(tài)檢查規(guī)范(cert C,misra C)。
函數(shù)的入?yún)⒁M(jìn)行范圍判斷。
不允許使用函數(shù)的遞歸。
優(yōu)先使用RAII技術(shù)來(lái)管理資源(使用C++語(yǔ)言),比如鎖,文件句柄等。
優(yōu)先使用引用來(lái)代替裸指針(使用C++語(yǔ)言)。
優(yōu)先使用智能指針代替裸指針(使用C++語(yǔ)言)。
盡量避免強(qiáng)制類型轉(zhuǎn)換。
3.測(cè)試
1. 測(cè)試用例
測(cè)試用例至少覆蓋以下幾種情況:
基本功能:典型時(shí)序(所有的錯(cuò)誤;異步超時(shí)需要重點(diǎn)關(guān)注)。
性能:性能相關(guān)時(shí)序。
邊界值:外部輸入所有的邊界值。
異常值:接口中數(shù)據(jù)范圍異常;時(shí)序重復(fù)混亂;備份數(shù)據(jù)損壞;服務(wù)器來(lái)的數(shù)據(jù)破壞;總線上數(shù)據(jù)異常等 。
惡意操作:ACC ON,OFF頻繁操作;外部線惡意插拔;外部沒(méi)有得到結(jié)果就再次請(qǐng)求;外部連續(xù)兩個(gè)相反的請(qǐng)求;外部連續(xù)兩個(gè)不同的請(qǐng)求等。
內(nèi)部狀態(tài):內(nèi)存使用量大時(shí);CPU占有率大時(shí);各種電源狀態(tài)下 。
外部狀態(tài):總線負(fù)載大時(shí);Linux下2038問(wèn)題;MQTT/HTTP同時(shí)進(jìn)行;正常功能和debug功能同時(shí)進(jìn)行。OTA/diag/factory reset處于執(zhí)行中時(shí)。
2. 測(cè)試工具
測(cè)試用例要能支持回歸測(cè)試。
搭建自動(dòng)化測(cè)試環(huán)境。
粉絲福利:Java從入門到入土學(xué)習(xí)路線圖
???

?長(zhǎng)按上方微信二維碼?2 秒
感謝點(diǎn)贊支持下哈?
