哈嘍,我是老吳。作為一個嵌入式底層碼農(nóng),在項目初期,我經(jīng)常需要測試各種 Linux 單板的穩(wěn)定性和性能。例如:用 memtester 測試內(nèi)存的穩(wěn)定性。用 glmark-es2 測試 GPU 的性能。用 iperf 測試網(wǎng)卡設(shè)備的帶寬。等一大堆、雜七雜八的測試項目。這些測試都不難,但是比較碎片化,一般都是基于簡單的測試腳本。為了節(jié)省我的時間和精力,我寫了一個簡單的測試框架。它的服務(wù)對象是像我這樣的嵌入式底層開發(fā)人員。我對它的要求是:能擴(kuò)展以適應(yīng)不同的單板;能自由地組合測試項;能對每個測試項進(jìn)行單獨地定制;能復(fù)用和積累各種測試腳本;下面是實現(xiàn)這個測試框架的關(guān)鍵點。
查找表
declare?-gA?fct_table=(['Test?1']="do_test1" ?['Test?2']="do_test2" ?['Test?3']="do_test3" ?['Test?4']="do_empty_handler" ?['Test?5']="do_empty_handler" ?['Test6']="do_empty_handler" ?) declare?-gA?res_table=(['Test?1']="N/A" ?['Test?2']="N/A" ?['Test?3']="N/A" ?['Test?4']="N/A" ?['Test?5']="N/A" ?['Test?6']="N/A" ?)
這里通過 Shell 的關(guān)聯(lián)數(shù)組定義了兩個查找表。fct_table 是測試函數(shù)表。res_table 是測試結(jié)果表。
測試函數(shù)
function?do_empty_handler() { ???echo?"Test?Not?Implemented:?$1" ???return?2 ?} function?do_test1 { ???echo?"Test?1" ???ret=0 ???return?$ret ?} function?do_test2 { ???echo?"Test?2" ???ret=0 ???return?$ret } function?do_test3 { ???echo?"Test?1" ???ret=0 ???return?$ret ?}
這里的每一個 test handler 函數(shù)就代表一個測試項目。只要將 memetester、iperf 等具體地測試命令填充進(jìn)行就可以執(zhí)行真實的測試了。
調(diào)度代碼
function?validate_system() { ??for?i?in?"${!fct_table[@]}";?do ????echo?"Test?:?$i" ????${fct_table[$i]} ????res=$? ????__update_result_table?$res?"$i"?res_table ??done ?} #?Main?entry?point validate_system print_result
遍歷 fct_table,取出每一個 test handler 并調(diào)用,然后用 __update_result_table() 將測試的結(jié)果填充到 res_table 中。到這里,這個測試框架就完成。
運(yùn)行效果
wwd@think:~/Desktop$?./board_test.sh? Test?:?Test?1 Test?1 >>>>>?SUCCESS Test?:?Test?3 Test?1 >>>>>?SUCCESS Test?:?Test?2 Test?2 >>>>>?SUCCESS Test?:?Test?5 Test?Not?Implemented:? >>>>>?N/A Test?:?Test?4 Test?Not?Implemented:? >>>>>?N/A Test?:?Test6 Test?Not?Implemented:? >>>>>?N/A TEST?RESULTS: ============ Test:?Test?1?Result:?PASS Test:?Test?3?Result:?PASS Test:?Test?2?Result:?PASS Test:?Test?5?Result:?N/A Test:?Test?4?Result:?N/A Test:?Test?6?Result:?N/A Test:?Test6?Result:?N/A
總結(jié)
這個簡單的測試框架非常輕巧且易于擴(kuò)展,但功能強(qiáng)大。在我的實際工作中被大量地使用,并且進(jìn)行了一些必要的擴(kuò)展,實實在在地降低了我的工作負(fù)擔(dān)。它完全可以作為第一次“冒煙測試”集成到更大的自動化系統(tǒng)中。