王國華,許永建,董晗,方益棟
上海微小衛(wèi)星工程中心,上海 201203
近年來,隨著核高基[1]等重大科技專項的展開,我國基礎(chǔ)軟硬件發(fā)展的步伐越來越快,部分芯片和操作系統(tǒng)性能已經(jīng)達到了和國際產(chǎn)品競爭的實力,也逐步形成了自己的軟硬件生態(tài)鏈[2-3],為國家的軍事裝備、企事業(yè)單位等提供了有力的支撐和保障。
隨著智能化的發(fā)展,嵌入式操作系統(tǒng)的應(yīng)用也越來越廣泛,大到火箭衛(wèi)星、小到個人電子產(chǎn)品,都可以見到嵌入式操作系統(tǒng)的身影。目前我國在各個領(lǐng)域很大程度上仍依賴國外的操作系統(tǒng),如風(fēng)河的VxWorks、蘋果的iOS以及谷歌的Android等。要實現(xiàn)裝備自給自足,有自己的操作系統(tǒng)是非常重要的一環(huán)。但是研發(fā)操作系統(tǒng)涉及的技術(shù)面較廣且過程漫長,保證操作系統(tǒng)的功能、性能、安全性、兼容性等符合使用需求十分重要。
軟件測試是提高嵌入式操作系統(tǒng)軟件質(zhì)量的有效手段,軟件測試主要是通過對操作系統(tǒng)提供的功能、性能、接口、兼容性、強度等指標的考核,驗證操作系統(tǒng)是否滿足用戶使用的需要[4]。處于產(chǎn)品研制階段的操作系統(tǒng),版本迭代頻繁,每一次的版本更新,都需要進行充分的測試,每一次的測試都需要將操作系統(tǒng)源碼和測試腳本進行編譯,在通過相關(guān)工具將鏡像下載到目標機執(zhí)行,最后對執(zhí)行結(jié)果進行分析,此過程工作量大,測試人員重復(fù)勞動,不但浪費了人力財力,測試充分性也得不到保證。測試的許多操作是重復(fù)性的,注重嚴格按照流程進行的動作,故測試在整個軟件研制過程中最容易進行自動化操作。但是目前對嵌入式操作系統(tǒng)自動化測試方法的探討并不多見。為了提高操作系統(tǒng)軟件測試效率,減輕人工操作強度,提升測試自動化水平,本文提出了一種嵌入式操作系統(tǒng)自動化測試方法,該方法利用Python腳本語言,結(jié)合版本控制工具、持續(xù)集成工具等,構(gòu)建嵌入式操作系統(tǒng)自動化測試框架。保證嵌入式操作系統(tǒng)質(zhì)量和可靠性。
嵌入式操作系統(tǒng)是一種廣泛用于工業(yè)制造、個人電子產(chǎn)品等領(lǐng)域的系統(tǒng)軟件,通常包括外設(shè)驅(qū)動、系統(tǒng)內(nèi)核、通信協(xié)議等模塊,其開發(fā)環(huán)境與運行環(huán)境分離,宿主機安裝集成開發(fā)環(huán)境、調(diào)試工具等,在宿主機上進行代碼編寫、模塊裁剪、編譯等操作,最終生成可加載文件,通過串口、調(diào)試器、網(wǎng)絡(luò)等手段加載到目標機中運行,通過串口工具或網(wǎng)絡(luò)等對目標機進行控制和監(jiān)視。這也導(dǎo)致了嵌入式操作系統(tǒng)測試與其他軟件測試的不同,如表1所示。
表1 嵌入式操作系統(tǒng)測試與其他軟件測試區(qū)別
嵌入式操作系統(tǒng)測試環(huán)境如圖1所示,主要包括宿主機、目標機、網(wǎng)絡(luò)設(shè)備、串口設(shè)備等。
圖1 嵌入式操作系統(tǒng)測試環(huán)境
在產(chǎn)品研發(fā)階段,操作系統(tǒng)測試流程一般如圖2所示,開發(fā)人員提交待測試軟件至版本控制服務(wù)器(如SVN、Git等);測試設(shè)計人員編寫測試腳本并入測試用例庫;測試執(zhí)行人員準備測試環(huán)境,主要包括宿主機、目標機、電源、串口工具、網(wǎng)線、外設(shè)以及代碼加載工具(FTP、TFTP)等。同時從版本控制服務(wù)器和測試用例庫獲取最新軟件版本和測試腳本,在宿主機中的集成開發(fā)環(huán)境中進行編譯生成可加載鏡像,通過代碼加載工具等下載到目標機運行,并記錄測試結(jié)果,匯總超時等待、異常等未執(zhí)行完成以及測試未通過用例。對未通過用例、異常用例以及超時用例進行分析,若為測試腳本問題,修改測試腳本并入庫,重新進行測試;若是軟件問題,則對問題進行詳細描述,將描述提交至問題庫,開發(fā)人員對問題進行閉環(huán),進入下一輪迭代,直至問題歸零。最終對測試過程、環(huán)境、系統(tǒng)功能、性能、接口等指標滿足情況進行說明,形成階段測試總結(jié)報告。在產(chǎn)品研發(fā)初期,會涉及多輪軟件的測試過程,也就意味著需要多次重復(fù)操作,而上述過程中的代碼編譯、鏡像加載、測試結(jié)果分析等在整個測試過程中占用了很多時間,浪費了很多資源。
圖2 嵌入式操作系統(tǒng)測試過程
針對上述問題,本文提出了自動化測試框架,能夠自主實現(xiàn)代碼更新監(jiān)測、代碼編譯、鏡像加載、結(jié)果分析等功能,本框架主要包括持續(xù)集成服務(wù)器、仿真設(shè)備、測試控制主機、被測目標機、電源、版本控制服務(wù)器等組成,如圖3所示。
圖3 自動化測試框架
整個自動化測試過程都由“測試控制主機”進行統(tǒng)一管理,測試控制主機安裝有集成開發(fā)環(huán)境、串口工具、Python腳本等,因此所有和測試過程相關(guān)的程序都在“測試控制主機”上統(tǒng)一運行。
測試管理的流程有以下幾個步驟。
(1)測試人員在操作系統(tǒng)新版本提交之前,與開發(fā)人員、設(shè)計人員等進行溝通,確定測試范圍,通過修改配置文件選擇測試用例工程,即通過配置的方式或命令參數(shù)傳入的方式確定本次測試的被測軟件系統(tǒng),以及本次測試所要執(zhí)行的測試用例集。
(2)軟件開發(fā)人員提交代碼到版本控制服務(wù)器之后,持續(xù)集成工具檢測到代碼更新,從版本控制服務(wù)獲取被測軟件包并編譯,生成操作系統(tǒng)庫文件。
(3)安裝在測試控制主機上的Python腳本文件根據(jù)第一步配置的參數(shù)從測試用例源碼庫獲取最新的測試用例源碼,并與操作系統(tǒng)庫共同構(gòu)建生成可加載鏡像文件,同時配置鏡像加載工具參數(shù)。
(4)測試調(diào)度,將對應(yīng)的測試用例部署到具備測試條件的被測目標機上,啟動測試用例的執(zhí)行,生成測試期待的輸入并記錄測試用例的輸出。
(5)測試人員判斷測試用例執(zhí)行結(jié)束、超時、無響應(yīng)等狀態(tài),并收集測試用例輸出結(jié)果。
(6)測試人員匯總并分析所有測試用例的運行結(jié)果,生成測試報告。
2.1.1 版本控制工具
軟件在開發(fā)完成初期,可能面臨頻繁的版本迭代,此時最重要的問題就是軟件版本的控制,而版本控制的核心任務(wù)則是能否查閱歷史操作記錄和實現(xiàn)協(xié)同開發(fā)。版本控制能追蹤項目從開始到結(jié)束的過程,對編程人員而言,版本控制是團隊協(xié)作的橋梁,有助于大型程序的多人同步開發(fā)。借助版本控制,項目被分割為多個模塊,每個模塊分配給不同的人員并行進行,從而提高了整體編程效率。操作系統(tǒng)產(chǎn)品開發(fā)階段采用版本控制工具[5]進行軟件版本管理是避免版本混亂、進行數(shù)據(jù)備份、提高代碼質(zhì)量、提高多人協(xié)同開發(fā)的效率,明確分工責(zé)任的有效途徑。主流的版本控制工具包括Git、SVN、HG、CVS等,其中SVN是一款開放源代碼的版本控制工具,具有目錄版本控制、版本歷史瀏覽、自動提交、分支管理、版本回退等功能,其速度快、安全性高、安裝簡單,可實現(xiàn)操作系統(tǒng)的代碼版本控制。
2.1.2 持續(xù)集成工具
持續(xù)集成是一種軟件開發(fā)過程中的連續(xù)動作,宗旨是避免集成問題,持續(xù)集成[6-8]強調(diào)開發(fā)人員提交了新代碼之后,立刻進行構(gòu)建、測試。根據(jù)測試結(jié)果,我們可以確定新代碼和原有代碼能否正確地集成在一起。目前國內(nèi)外主流的持續(xù)集成工具主要有Jenkins、CircleCI、Travis CI等,其中Jenkins自誕生之日起,至今已發(fā)展了近20年,是較為成熟的持續(xù)集成工具,從理論上講,可與任何類型的版本控制工具兼容,主要用于持續(xù)、自動地構(gòu)建/測試軟件項目、監(jiān)控外部任務(wù)的運行。
2.1.3 Python簡介
Python語言[9-10]誕生于上個世紀末,是一種解釋型語言,提供了高效的數(shù)據(jù)結(jié)構(gòu)同時還能支持面向?qū)ο缶幊?,能夠在Windows、Linux、macOS等操作系統(tǒng)中運行,其具有簡單易學(xué)、易讀、易維護、速度快、可移植性強等優(yōu)點,同時具有大量的擴展庫,利用擴展庫可快速實現(xiàn)串口讀寫、文件解析等功能。在嵌入式操作系統(tǒng)測試腳本加載、過程監(jiān)控、結(jié)果分析中使用Python語言進行設(shè)計,可以簡化開發(fā)過程,減少維護成本。
2.1.4 鏡像加載工具
嵌入式操作系統(tǒng)測試大多采用調(diào)試模式,即通過網(wǎng)絡(luò)、串口等將操作系統(tǒng)鏡像加載到目標機運行,通過串口進行控制以及結(jié)果查詢。通過網(wǎng)絡(luò)進行操作系統(tǒng)鏡像加載的手段有TFTP或FTP等,不同的目標板配置不同,如龍芯處理器一般采用PMON引導(dǎo)程序,支持TFTP工具進行引導(dǎo),而PowerPC平臺一般采用FTP工具引導(dǎo),較常用的TFTP工具是TFTPd32,該工具操作簡單、使用方便。作為TFTP服務(wù)端,提供操作系統(tǒng)鏡像加載功能。常用的FTP服務(wù)器軟件如FTPserver,工具小巧且無需安裝,此外也可利用嵌入式操作系統(tǒng)開發(fā)平臺本身提供的FTP功能,進行操作系統(tǒng)鏡像加載。
首先對測試用例腳本做如下格式約定:在測試用例執(zhí)行完成后輸出{project:xxx,test_case:yyy,result:TESTFAIL}或{project:xxx,test_case:yyy,result:TESTPASS}。其中“project:xxx”為測試工程,“test_case:yyy”為project工程下的測試用例,如果用例執(zhí)行失敗則輸出“TESTFAIL”,否則輸出“TESTPASS”。工程內(nèi)所有測試用例腳本執(zhí)行完畢后輸出“Tests finished!”作為整個工程運行結(jié)束標志。此外,確保測試腳本其余位置不能出現(xiàn)上述描述,Python腳本會根據(jù)格式約定的內(nèi)容進行測試腳本執(zhí)行結(jié)果的統(tǒng)計以及測試是否正常結(jié)束。
編寫配置文件args.txt,配置文件用來指定測試用例鏡像加載時相關(guān)參數(shù),其中宿主機IP指的是安裝了嵌入式操作系統(tǒng)開發(fā)環(huán)境的PC的網(wǎng)絡(luò)地址,目標機IP指的是運行操作系統(tǒng)鏡像的目標板網(wǎng)絡(luò)地址。串口設(shè)備用來對目標機進行控制以及測試結(jié)果的顯示等;workspace指定測試用例腳本所在工作空間,project指定需要測試的項目,此外還可設(shè)置波特率、目標板相關(guān)信息等。
#宿主機IP。
#例如:ipaddr=192.168.1.28;
#目標機IP(即目標板卡IP)。
#例如:ipaddr=192.168.1.28;
#變量serial指定串口設(shè)備。
#串口1:/dev/com1; 串口2:/dev/com2;......;
#例如:serial=/dev/com1;
#變量workspace指定工作空間目錄;
#例如:workspace=E:workspace;
#變量proj指定需要測試的項目。
#如果不指定該選項,則默認測試工作目錄下的所有項目。
#例如:proj=test_func test_perf test_strong test_safety test_elf;
#變量波特率,8641d 波特率是 9600;
baudrate=115200;
安裝版本控制工具到版本控制服務(wù)器,軟件開發(fā)人員開發(fā)完成代碼后提交最新版代碼至版本控制服務(wù)器;安裝持續(xù)集成工具到測試控制主機,工具持續(xù)監(jiān)測操作系統(tǒng)版本是否有更新,若有則從版本控制服務(wù)器獲取最新版本并進行編譯,更新集成開發(fā)環(huán)境中的操作系統(tǒng)庫文件。
編寫Python腳本,掃描開發(fā)環(huán)境中的操作系統(tǒng)庫文件,判斷操作系統(tǒng)庫文件是否有更新,若有則從測試用例庫獲取最新測試用例,與操作系統(tǒng)二進制文件共同編譯生成可加載鏡像。編寫Python腳本讀取args.txt中的相關(guān)參數(shù),配置FTP或TFTP工具中的加載參數(shù),如IP地址信息、鏡像路徑信息、加載地址等。
安裝TFTP或FTP工具,用于在Python完成加載參數(shù)配置和代碼編譯后,將操作系統(tǒng)鏡像加載到目標機。
編寫Python腳本根據(jù)目標機輸出信息實時分析測試用例執(zhí)行情況,判斷用例是否正常結(jié)束、超時、無響應(yīng)等狀態(tài),對長時間等待或無響應(yīng)的用例及時做出相應(yīng)處理,執(zhí)行后續(xù)用例,直至測試用例全部執(zhí)行完畢。
編寫Python腳本對輸出測試結(jié)果進行分析匯總,上報測試執(zhí)行情況,提交測試問題,形成測試報告。同時為被測目標機清理測試環(huán)境并斷電。
Python腳本在首次編寫完成并運行正常后,后續(xù)測試無需修改。
在測試開始前將目標機與宿主機通過網(wǎng)線、串口線連接,修改網(wǎng)絡(luò)IP地址,使宿主機與目標機在相同網(wǎng)段內(nèi),確保網(wǎng)絡(luò)通暢;配置串口波特率、奇偶校驗位、數(shù)據(jù)位、停止位等參數(shù),使串口通信正常;目標機連接電源、配合測試的仿真設(shè)備、硬件外設(shè)等,電源開始加電。
本測試框架的工作流程如圖4所示,其主要功能在于利用持續(xù)集成工具監(jiān)測操作系統(tǒng)版本更新情況,完成操作系統(tǒng)鏡像自動化編譯,通過Python腳本控制TFTP或FTP工具完成鏡像自動加載,利用Python腳本對串口進行控制,實現(xiàn)測試過程控制、對結(jié)果自動分析等。其中,僅在選擇要測試的腳本動作上需進行人工操作,測試用例腳本編譯、鏡像加載、測試結(jié)果分析等步驟均可通過本框架自動執(zhí)行,在一定程度上提高了嵌入式操作系統(tǒng)自動化測試水平,節(jié)約了人力成本。
圖4 框架工作流程
本文針對嵌入式操作系統(tǒng)自動化測試方法進行了探討,分析了嵌入式操作系統(tǒng)的測試方法、測試過程、結(jié)果統(tǒng)計等方面。最終結(jié)合嵌入式操作系統(tǒng)測試現(xiàn)狀,提出了依據(jù)軟件加載工具、版本管理工具、持續(xù)集成工具以及Python語言的嵌入式操作系統(tǒng)自動化測試框架,該方法可實現(xiàn)測試腳本自動編譯、鏡像自動加載、測試自動執(zhí)行、結(jié)果自動分析,測試過程無需人工干預(yù),極大地減輕了測試人員的壓力,提高了自動化程度,為嵌入式操作系統(tǒng)自動化測試提供了良好的途徑。