李耀 周亞明 羅輝 黎毅輝
(威勝信息技術股份有限公司 湖南省長沙市 410205)
嵌入式軟件是運行在嵌入式系統(tǒng)上的一組針對特定硬件而設計的應用程序,這些應用程序通常是為了滿足客戶特定需求而預先定義的一套專用的軟件,它不僅受制于特定的硬件資源限制,比如:CPU 頻率、內(nèi)存空間、存儲空間等等,而且其功能還受限于接入嵌入式系統(tǒng)的外圍硬件電路、元器件等所帶來的影響。為實現(xiàn)電子設備設定的功能、成本、體積、功耗等要求,嵌入式軟件必須強調軟硬件的協(xié)同性、可靠性和可裁剪性,因此,針對嵌入式軟件的測試遠比傳統(tǒng)軟件的測試要更加復雜和困難。本文主要是結合嵌入式軟件的特點,討論如何利用Docker 容器技術具有的一些優(yōu)勢和特性對傳統(tǒng)嵌入式軟件測試過程中被測試對象的交付、安裝和部署方法,對嵌入式軟件測試環(huán)境搭建,測試工具使用等方面進行的改進和優(yōu)化。最后通過在臺區(qū)智能終端的應用,驗證基于Docker 的嵌入式軟件測試可有效降低測試復雜性、提升測試效率和提高資源利用率。
隨著物聯(lián)網(wǎng)時代的到來,以及設備智能化的推廣應用,嵌入式軟件的質量和可靠性日益成為人們關注的焦點,與之相關的測試技術也逐漸受到研發(fā)人員和檢測機構的重視。由于嵌入式軟件的應用越來越廣泛和深入,使得這些軟件的規(guī)模與復雜度不斷增長,不僅導致開發(fā)難度加大,而且針對嵌入式軟件的測試也變得越來越復雜。但傳統(tǒng)的軟件測試技術還沒有完全適應這種變化,已凸顯出一些不足之處:
嵌入式軟件測試是一項復雜性高、 綜合性強的工作,不僅受制于特定硬件設計,而且受限于系統(tǒng)資源,需要測試人員具備較高的業(yè)務水平和較強的專業(yè)知識,才能發(fā)現(xiàn)被測對象可能存在的缺陷。同時,由于被測試嵌入式軟件的交付大多是基于可執(zhí)行程序或軟件壓縮包方式進行,需要手動搭建測試環(huán)境并配置各種所需的依賴關系,操作起來十分繁瑣。隨著電子設備的功能不斷增多,其中的嵌入式軟件規(guī)模與復雜度還在不斷提高,依賴關系和包含的組件也越來越復雜。
隨著開發(fā)迭代速度的加快,嵌入式軟件更新頻率已由原來以月、年為單位發(fā)展到現(xiàn)在的以天、周為單位,但嵌入式軟件測試環(huán)境搭建復雜且不靈活,測試不同的軟件或版本時,需要重復搭建多套測試環(huán)境,設置不同的相關參數(shù),搭配各種不同的外接設備和檢測工具,測試人員需要進行大量復雜的手工操作,有時還會因此產(chǎn)生錯誤或遺漏。測試的軟件質量以及項目進度往往比預計的差很多,因而導致測試效率跟不上軟件發(fā)布的節(jié)奏。
盡管搭建嵌入式軟件測試的環(huán)境非常繁瑣,但一套測試環(huán)境往往沒辦法并行測試多個不同版本或功能的嵌入式軟件,因為大部分嵌入式軟件都會獨占系統(tǒng)的資源,同時彼此之間還會相互影響,這就導致搭建出來的測試環(huán)境利用率并不高,在相關硬件和配套外接設備都較為短缺時,這種情況更是雪上加霜。雖然還可以基于虛擬機方式搭建嵌入式軟件測試環(huán)境,但這項技術本身非常消耗宿主機的資源,從而又會導致系統(tǒng)資源利用率降低。

圖1:Docker 的總體架構

圖2:嵌入式軟件測試環(huán)境

圖3:Docker 環(huán)境安裝驗證

圖4:容器并行測試
目前面臨的測試環(huán)境搭建復雜、測試效率不高、資源利用率較低的問題已成為嵌入式軟件測試亟待解決的問題。在此情況下,結合嵌入式軟件的特點,研究如何利用新的測試技術和方法來構建嵌入式軟件測試過程,對降低測試復雜度、提升測試效率和提高測試資源利用率具有十分重要的意義。
由于存在對硬件有較高的依賴性、受限于系統(tǒng)資源不足、開發(fā)環(huán)境與運行環(huán)境不一致等問題,針對嵌入式軟件的測試通常會比傳統(tǒng)的軟件測試更加復雜。國外研究嵌入式軟件測試技術開始于上個世紀七十年代,Robert L.Glass 在1980年發(fā)表的一篇文章[1],論述了嵌入式軟件測試技術落后于傳統(tǒng)軟件測試技術的原因并給出了一些解決方案,對嵌入式軟件測試技術的發(fā)展影響深遠。國內(nèi)研究首先是在國防領域開始對嵌入式軟件測試技術和工具進行的。針對艦船嵌入式軟件的特點,韓新宇等人[2]提出測試用例自動驅動方案,并基于此方案設計出測試用例自動驅動平臺。王浩宇等人[3]在雷達嵌入式軟件測試領域實現(xiàn)對Cuttle ISE 的應用。之后肖永健等人[4]研究出一種基于軟件故障注入的邏輯覆蓋測試平臺。盡管嵌入式軟件測試技術已得到廣泛應用,但目前國內(nèi)對嵌入式軟件測試技術和工具的研究仍處于起步階段,特別是很少考慮嵌入式軟件測試環(huán)境搭建復雜、測試效率不高和資源利用率低的問題,這些問題卻是影響嵌入式軟件開發(fā)進度和成本的關鍵因素,仍需要進行深入的研究。
容器技術(Container)是一種新型的虛擬化技術,它是操作系統(tǒng)中一組受到資源限制且彼此間相互隔離的獨立進程。相比傳統(tǒng)的虛擬機技術,容器技術資源利用率更高效、軟件封裝性更簡單、軟件遷移和擴展更方便。Docker 是依托于Linux 內(nèi)核的容器技術而發(fā)展起來的一種目前主流的容器引擎,它將底層系統(tǒng)、依賴環(huán)境、應用程序等進行統(tǒng)一打包,并形成一個整體的鏡像文件,最后作為一個獨立的容器部署在其他的平臺或宿主機上。
Docker 主要是實現(xiàn)應用軟件層的虛擬化,通過沙盒機制可以保證在容器中運行的任何應用軟件都是獨立的,與外界的軟件接口都是可控的,從而保障了數(shù)據(jù)的安全性和運行的可靠性。不同于其他虛擬化技術,Docker 直接運行在宿主機的操作系統(tǒng)之上,底層硬件并沒有虛擬化,因而可用最小的硬件開銷達到更高的計算能力,這也為Docker 在嵌入式系統(tǒng)上應用提供了理論依據(jù)和技術可行性。如圖1 所示,Docker 的架構是基于Client-Server 模式設計的,服務端啟動后會在宿主機上運行一個守護進程,客戶端通過這個守護進程來遠程控制Docker 容器的創(chuàng)建、運行、停止、刪除等操作。
Docker 的鏡像文件是基于分層結構設計的,但其中并沒有包含Linux 內(nèi)核,只包含了運行所需要的文件系統(tǒng)結構。Docker 容器是鏡像文件的運行態(tài)體現(xiàn),Docker 容器的文件系統(tǒng)大部分來自鏡像文件,其他為鏡像新建的內(nèi)容可分為初始層和讀寫層。初始層主要包括在初始化容器環(huán)境時產(chǎn)生的相關默認文件,而Docker 容器內(nèi)的進程只能對讀寫層擁有寫權限,其他層對進程而言都是只讀的。這樣從操作系統(tǒng)層面上就避免了軟件被誤刪或破壞的可能性,即便被強制破壞,也可以通過Docker 的初始化命令恢復到初始狀態(tài)。Docker 還使用了寫入時復制技術(Copy-On-Write),所有運行中的容器可以先共享一個基礎文件系統(tǒng),當需要向文件系統(tǒng)進行寫操作時,就引導它寫到與該容器相關的另一個特定文件系統(tǒng)中,從而避免意外刪除或修改基礎文件系統(tǒng),同時也避免通過文件系統(tǒng)改變自身容器以外的內(nèi)容。
不同于傳統(tǒng)意義上的虛擬化技術,應用軟件的隔離性與安全性是在操作系統(tǒng)之上由Docker 引擎來提供保證的。由于應用軟件運行在容器中,并與其他容器中的應用軟件和根文件系統(tǒng)進行隔離,因而宿主機的系統(tǒng)基本不會被應用軟件或異常操作破壞。如果應用軟件因受到外部攻擊而癱瘓,只需要重啟容器或啟動一個新的容器即可恢復,并不需要重新啟動宿主機,也不會影響到其他容器的正常運行。我們可以用Docker 在不同的容器中并行運行不同的應用軟件,如果不再需要某個應用軟件,就可以通過刪除容器中的這個應用軟件來完成,并且操作系統(tǒng)上不會因此留下任何臨時文件。此外,Docker 還能確保每個應用軟件只能使用分配給它的資源,包括CPU、內(nèi)存、網(wǎng)絡、存儲空間等,不會因為程序缺陷或惡意行為占用到系統(tǒng)全部的可用資源,避免了因此導致系統(tǒng)性能降低或被拖垮。
測試人員不再需要為測試某個版本的應用軟件重復安裝操作系統(tǒng)、配置運行環(huán)境和設置相關參數(shù),這些手動或半自動的復雜操作,極容易人為引入一些操作錯誤或遺漏某些步驟。基于Docker 鏡像的嵌入式軟件測試已將這些復雜的配置過程封裝起來,不僅減少了重復的操作,還讓測試過程的整體復雜性最小化。
基于Docker 的嵌入式軟件測試可使得一套測試環(huán)境能夠同時用于多個不同軟件的測試中,而且彼此之間并不會受到太多相互影響。特別是在樣機測試階段,相關的硬件和配套的外圍設備都較為短缺,此時不僅可以提高測試環(huán)境和專用設備的利用率,而且還降低了為搭建多套測試環(huán)境所產(chǎn)生的費用。
由于不再需要重復搭建多套測試環(huán)境、也不需要準備過多的硬件檢測設備,只需要通過容器管理工具將包含測試對象的Docker鏡像文件部署到測試環(huán)境中,就可以很快在相關的應用場景中開始測試。因而嵌入式軟件測試的效率得到極大提升,特別是在做回歸測試和現(xiàn)場驗證時,相比傳統(tǒng)的方式更有優(yōu)勢。
臺區(qū)智能終端是一種由我司研制的用于配網(wǎng)供用電信息采集、電能表和各類傳感器數(shù)據(jù)收集、設備狀態(tài)監(jiān)測等功能于一體的智能化電力電子設備。它的核心主板硬件提供了ARM Cortex-A7 架構四核CPU、2GB DDR3L 內(nèi)存、4GB eMMC 存儲器,目前搭載的操作系統(tǒng)是ARM 32bit 版本的Ubuntu16.04 發(fā)行版。同時配有4 個UART 接口、載波模塊、時鐘芯片、4G 模塊、GPIO、以太網(wǎng)等豐富的接口和外接器件。如圖2 所示,以下將基于臺區(qū)智能終端搭建一整套嵌入式軟件測試環(huán)境。臺區(qū)智能終端安裝在電氣柜的左上角,下方通過RS485 接入了漏電保護器、智能開關、三相電能表、末端感知裝置及負載,臺區(qū)智能終端的操作系統(tǒng)上部署了Docker,同時通過自編寫的C/C++應用程序,實現(xiàn)數(shù)據(jù)的采集與存儲。
首先通過以太網(wǎng)登陸到臺區(qū)智能終端的Linux 控制臺,并在設備的宿主機中安裝Docker 服務。可以通過Docker 官方指導文檔進行遠程安裝Docker 服務,具體操作命令為:“curl -fsSL get.docker.com -o get-docker.sh”和“sh get-docker. sh”,安裝完成后如圖3 所示。可以通過命令“docker exec -it c_data /bin/bash”進入運行中的Docker 容器,查看應用程序在容器內(nèi)部的執(zhí)行情況。另外,還可以在PC 主機的交叉編譯環(huán)境下編譯ARM 版本的應用程序,再采用Dockerfile 的方式將生成可執(zhí)行程序和運行所需的配置文件整合打包進Docker 鏡像文件中,最后通過部署該鏡像文件到啟動Docker容器中,就能實現(xiàn)自己編寫的應用程序在Docker 容器中運行。
使用Docker 主要就是為了能夠在不同的容器中同時運行多個應用程序,這樣就可以提高嵌入式軟件測試環(huán)境的利用率,提升嵌入式軟件測試的效率。如圖4 所示,以下利用自己編寫的三個嵌入式程序打包生成的Docker 鏡像:數(shù)據(jù)中心c_data、數(shù)據(jù)采集c_base和IEC104 協(xié)議c_104,連同搭載Docker 的臺區(qū)智能終端組成一套測試驗證環(huán)境。驗證的思路是先后啟動容器加載這三個Docker 鏡像,分別利用數(shù)據(jù)采集c_base 完成數(shù)據(jù)的收集,利用數(shù)據(jù)中心c_data 完成數(shù)據(jù)的存儲,利用IEC104 協(xié)議c_104 完成數(shù)據(jù)上送到主站。由于Docker 下的容器運行采用的是沙盒機制,因而各容器是互相獨立的,并且互不影響。首先由數(shù)據(jù)采集c_base 收集外接設備的各類電參量實時數(shù)據(jù),并寫入數(shù)據(jù)到數(shù)據(jù)中心c_data,交由數(shù)據(jù)中心c_data 完成數(shù)據(jù)的存儲。此時主站可通過IEC104 協(xié)議c_104 同時向臺區(qū)智能終端召測所需數(shù)據(jù),然后由IEC104 協(xié)議c_104 向數(shù)據(jù)中心c_data 發(fā)出讀取數(shù)據(jù)的命令,并由數(shù)據(jù)中心c_data 完成讀取數(shù)據(jù)的返回。三個嵌入式程序分別安裝在不同的容器中,相互之間收發(fā)數(shù)據(jù)都只允許通過TCP 或UDP 的網(wǎng)絡連接進行。
利用Docker 容器技術,可以實現(xiàn)運行于不同環(huán)境下的嵌入式程序在同一臺宿主機中共存,Docker 通過隔離底層操作系統(tǒng)與應用軟件,做到了嵌入式軟件運行環(huán)境的統(tǒng)一,不僅降低了嵌入式軟件開發(fā)過程中依賴運行環(huán)境所做的大量移植工作,而且通過Docker的核心組件還可以為應用軟件的組合、鏡像文件的制作提供便利的工具和方案。
嵌入式軟件因其架構的特殊性,測試起來并不像傳統(tǒng)軟件那樣簡單容易。而隨著物聯(lián)網(wǎng)的蓬勃發(fā)展、各類設備功能的日益強大,業(yè)務需求的不斷增加,也導致針對嵌入式軟件的測試愈發(fā)復雜。在眾多測試方案中,基于Docker 的嵌入式軟件測試優(yōu)勢明顯,不僅占用系統(tǒng)資源少、運行環(huán)境統(tǒng)一,而且啟動速度快、安裝部署方便,大幅降低測試人員的工作量。通過在臺區(qū)智能終端上驗證基于Docker 的嵌入式軟件測試環(huán)境,充分挖掘出其應用潛能,并為降低嵌入式軟件測試的復雜度,提升嵌入式軟件的測試效率,提高測試環(huán)境和測試資源的利用率帶來幫助。