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

?長按上方微信二維碼?2 秒
感謝點贊支持下哈?
