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