劉錢超,董超群,張 垚
(江南計算技術(shù)研究所,江蘇 無錫 214083)
隨著計算機科學(xué)技術(shù)的不斷發(fā)展,軟件在國民經(jīng)濟和社會生活等方面的應(yīng)用越來越廣泛和深入。應(yīng)用的廣泛性使得軟件質(zhì)量日益成為關(guān)注的焦點。軟件測試作為保證軟件質(zhì)量和可靠性的關(guān)鍵手段,逐漸受到軟件機構(gòu)和開發(fā)人員的重視,軟件測試階段在整個軟件開發(fā)周期中所占的比重也日益增大。大數(shù)據(jù)、云計算時代的到來,軟件特征和表現(xiàn)形式都發(fā)生了深刻的變化,傳統(tǒng)的軟件測試?yán)碚撆c技術(shù)逐漸暴露出許多問題,制約了軟件測試的發(fā)展,也使得軟件測試成本不斷增加。據(jù)統(tǒng)計,目前軟件測試與維護(hù)成本占軟件總開發(fā)成本的40%~50%[1],在關(guān)鍵領(lǐng)域的應(yīng)用軟件,軟件測試成本甚至遠(yuǎn)遠(yuǎn)超過軟件開發(fā)成本。在此情形下,研究如何利用新的理論、技術(shù)和方法來優(yōu)化軟件測試過程,從而提高測試效率和降低測試成本具有十分重要的意義。
Docker容器技術(shù)作為新一代的虛擬化技術(shù),相比傳統(tǒng)虛擬機技術(shù),具有很多優(yōu)勢,如更高效的資源利用率、支持更輕量的資源分配、良好的軟件封裝性、更輕松的遷移和擴展等。文中主要討論如何利用Docker容器技術(shù)具有的一些優(yōu)勢和特性對傳統(tǒng)軟件測試過程進(jìn)行優(yōu)化,以期解決目前軟件測試中存在的問題并提高測試效率,降低測試成本。
隨著大數(shù)據(jù)、云計算技術(shù)的不斷發(fā)展,計算機軟件的規(guī)模和復(fù)雜度不斷增長,軟件測試對象變得越來越復(fù)雜,導(dǎo)致傳統(tǒng)軟件測試?yán)碚撆c技術(shù)逐漸失去了適用性,極大地影響了軟件測試工作。目前在軟件測試工作中暴露出的問題主要表現(xiàn)在以下幾個方面:
(1)平臺軟件的復(fù)雜性和發(fā)布節(jié)奏之間的矛盾。如今,軟件迭代速度不斷加快,軟件更新頻率已由原來以月、年為單位發(fā)展到現(xiàn)在的以天、周為單位。據(jù)統(tǒng)計,大數(shù)據(jù)生態(tài)系統(tǒng)組件平均更新速度為2周,如此短的軟件迭代周期給軟件的測試效率提出了更高的要求[2]。
(2)被測試軟件的交付和安裝部署繁瑣。隨著計算機所控制的對象的復(fù)雜性程度不斷提高和軟件功能的不斷增強,軟件規(guī)模與復(fù)雜度也在不斷增大,軟件依賴和包含的組件變得十分復(fù)雜。目前被測試軟件的交付大多是基于源代碼或軟件安裝包方式,需要測試人員手工搭建測試環(huán)境并配置各種所需的軟件依賴,十分繁瑣,還可能因軟件環(huán)境和配置的差異導(dǎo)致被測軟件出錯,無法保持軟件“開發(fā)—測試—生產(chǎn)”環(huán)境的一致性。
(3)軟件測試基礎(chǔ)設(shè)施搭建速度慢、耗時長、不靈活。目前,軟件測試環(huán)境的構(gòu)建多是基于虛擬機方式,在物理機集群上新建大量虛擬機,在虛擬機內(nèi)部布設(shè)被測軟件所依賴的各種環(huán)境。這種方式由于虛擬機是比較重載的虛擬化技術(shù),對宿主機系統(tǒng)資源消耗大,導(dǎo)致資源利用率不高。另一方面,基于虛擬機的資源管理較為笨重,難以實現(xiàn)資源的細(xì)粒度分配和應(yīng)用的快速遷移與擴展。
(4)分布式軟件的可伸縮性測試方法具有局限性。目前,對分布式軟件進(jìn)行可伸縮性測試時,采取的方法是在物理機集群上新建大量虛擬機,在虛擬機內(nèi)安裝配置被測試軟件,然后測試其功性能指標(biāo)。這種測試方法的主要問題在于,一是擴展速度慢,基礎(chǔ)設(shè)施搭建和軟件安裝配置需要大量時間,延誤測試進(jìn)度。二是容易因物理資源有限而無法開展大規(guī)模可伸縮性測試,達(dá)不到可伸縮性測試要求,如當(dāng)被測試軟件需要在物理機上擴展10 000以上節(jié)點時,這在有限的服務(wù)器硬件資源條件下是無法進(jìn)行測試的。
如何利用現(xiàn)有理論、方法和技術(shù)來優(yōu)化軟件測試工作一直是國內(nèi)外軟件機構(gòu)的研究熱點,近年來有許多相關(guān)方面的研究工作。
文獻(xiàn)[3]中,Scott Tilley和Tauhida Parveen在CMU/SEI的SMART[4]基礎(chǔ)上,提出了SMART-T模型。SMART模型是一系列指導(dǎo)方針,旨在幫助軟件企業(yè)和機構(gòu)對面向服務(wù)的體系結(jié)構(gòu)(SOA)環(huán)境下重用遺留組件作為服務(wù)的可行性做出初步?jīng)Q策。與SMART模型不同的是,SMART-T更專注于軟件測試“Test”。它進(jìn)一步明確了SMART模型在軟件測試遷移至云環(huán)境的應(yīng)用方式,主要由3部分組成:業(yè)務(wù)驅(qū)動、技術(shù)因素、運行結(jié)果。每一部分結(jié)束時都會做出將軟件測試遷移至云環(huán)境的可取性、可行性和可接受性相關(guān)的決策,給軟件測試機構(gòu)提供了更具體明確的指導(dǎo)方針。Scott Tilley和Tauhida Parveen也基于Hadoop平臺構(gòu)建了云環(huán)境下測試用例并行執(zhí)行的分布式環(huán)境HadoopUnit,在該分布式環(huán)境下,測試用例能夠并行執(zhí)行,可以有效地加快測試用例執(zhí)行速度。但上述優(yōu)化方法的不足之處在于,對于是否將測試環(huán)境遷移至云環(huán)境下的決策主要由人來評判,缺乏足夠的數(shù)據(jù)支撐,可能會出現(xiàn)判斷失誤。
文獻(xiàn)[5]中,Joshua Higgins等基于Docker構(gòu)建了一個VCC(virtual container cluster)集群。VCC不僅是一個分布式的容器集群環(huán)境,還是一個自動化的打包工具。將VCC應(yīng)用到軟件測試中,有效地提高了被測試軟件的可移植性和可重現(xiàn)性[3]。但存在的問題在于,VCC的應(yīng)用場景具有局限性,主要針對分布式軟件,對單機軟件并不適用。
傳統(tǒng)虛擬化技術(shù)如VMware、Xen、KVM、Microsoft Hyper-v等由于需要模擬一個完整的操作系統(tǒng)層,導(dǎo)致硬件資源利用率不高,給大數(shù)據(jù)云計算等大規(guī)模集群應(yīng)用帶來了不小的資源開銷。為了尋求更高效的虛擬化技術(shù)替代方案,dotCloud公司于2013年將一些現(xiàn)有容器技術(shù)進(jìn)行包裝整合后推出了開源的容器引擎項目Docker,并將項目代碼托管在GitHub上。得益于趕上一場IT開發(fā)行業(yè)從SOA架構(gòu)向微服務(wù)架構(gòu)的技術(shù)變革,Docker迅速取得了成功,得到學(xué)術(shù)界和工業(yè)界的廣泛應(yīng)用[6]。
Docker作為軟件技術(shù)層面可移植的輕量容器,是一種不受底層操作系統(tǒng)限制,即可在任何運行著Docker引擎的機器上運行的虛擬化解決方案[7]。Docker容器技術(shù)相比于傳統(tǒng)虛擬機技術(shù),具有以下優(yōu)勢:
(1)Docker可以將應(yīng)用程序及其依賴環(huán)境打包成鏡像文件,基于鏡像文件可以在任何Linux系統(tǒng)中進(jìn)行軟件安裝和部署,極大地提高了軟件的可移植性和可重現(xiàn)性。
(2)Docker是進(jìn)程級的虛擬化技術(shù),相比于傳統(tǒng)虛擬機技術(shù),由于沒有了硬件模擬層開銷,更輕量、快速和高效。在容器內(nèi)運行應(yīng)用程序時,與虛擬機技術(shù)不同,Docker可以直接調(diào)用系統(tǒng)內(nèi)核執(zhí)行命令,不需要經(jīng)過中間層翻譯,因此資源的開銷更小,啟動速度更快。
(3)Docker容器只需要數(shù)秒即可啟動,比虛擬機需要數(shù)分鐘啟動更快,Docker輕量和快速啟動的特性使得較于重載的虛擬機而言,可以更輕松地進(jìn)行遷移和擴展。
容器云是以容器為資源分割和調(diào)度的基本單位,封裝整個軟件運行時環(huán)境,為開發(fā)者和系統(tǒng)管理員提供用于構(gòu)建、發(fā)布和運行分布式應(yīng)用的平臺[8]。容器云相較于虛擬機集群,憑借Docker輕量、快速、高效的特點,能夠?qū)崿F(xiàn)資源的細(xì)粒度分配和應(yīng)用的快速遷移與擴展。
為了給容器化應(yīng)用提供支撐環(huán)境和更好地優(yōu)化軟件測試基礎(chǔ)設(shè)施搭建方式,文中基于Docker、Zookeeper、Etcd等技術(shù)搭建了面向軟件測試的彈性容器的云平臺(flexible container cloud for software testing,F(xiàn)CC-ST)。
FCC-ST采用B/S模式,統(tǒng)一由瀏覽器認(rèn)證并管理。它提供兩種工作模式,分別是Cluster Mode和Single Mode。其中,Cluster Mode是由Control Center對集群進(jìn)行監(jiān)控和管理,Single Mode是對單個物理節(jié)點進(jìn)行監(jiān)控和管理,包括對其上的容器進(jìn)行新建、銷毀和遷移操作,新加入的物理節(jié)點可以選擇多種模式。FCC-ST平臺具有以下功能:
(1)物理節(jié)點和容器都可以快速靈活地進(jìn)行彈性伸縮,只需在待加入的物理節(jié)點上運行相應(yīng)的代理容器即可添加到FCC-ST彈性容器云中,容器新建、銷毀和管理操作也都十分便捷。
(2)通過Web界面來新建、銷毀和管理容器,十分方便,具有很強的易操作性。
(3)管理私有倉庫,可以將自己部署好的私有倉庫添加到FCC-ST平臺中進(jìn)行管理。
(4)集群容器調(diào)度,當(dāng)需要部署一個鏡像時,編寫好配置文件,F(xiàn)CC-ST會自動根據(jù)配置文件進(jìn)行集群部署,并通過WebHook通知部署結(jié)果。
(5)對容器管理進(jìn)行權(quán)限設(shè)定,分為普通用戶和管理員用戶,分別具有不同的權(quán)限。
憑借Docker具有的高效資源利用率、更輕量的資源分配、良好的軟件封裝性、更輕松的遷移和擴展等特性及FCC-ST平臺,對圖1所示的軟件測試過程中被測試軟件的交付和安裝部署方法、軟件測試基礎(chǔ)設(shè)施搭建方式、測試工具使用和軟件可伸縮性測試方法等進(jìn)行優(yōu)化,以解決目前軟件測試面臨的問題并提高測試效率。
(1)優(yōu)化被測試軟件的交付和安裝部署。
被測試軟件的交付和部署一直是困擾軟件開發(fā)和測試人員的難題,一是軟件安裝配置本身比較復(fù)雜,耗時費力,二是難以保持軟件開發(fā)環(huán)境和測試環(huán)境的一致性,經(jīng)常會出現(xiàn)軟件各項功能在開發(fā)環(huán)境中表現(xiàn)正常,在測試環(huán)境中卻頻繁報錯的情況。針對這個問題,部分測試機構(gòu)采取使用虛擬機打包被測試軟件的做法,但因虛擬機體量過大,不利于軟件的便捷交付。
Docker正好可以比較好地解決這個問題。Docker具有良好的軟件封裝性,能夠快速、準(zhǔn)確、標(biāo)準(zhǔn)化地封裝應(yīng)用程序并自動化部署整個運行環(huán)境。利用Docker將被測試軟件及其依賴的各種運行時環(huán)境一起打包成容器鏡像并交付給測試機構(gòu)。測試機構(gòu)只需要在任何支持容器運行環(huán)境下,就可以快速將被測軟件安裝運行起來,避免了復(fù)雜的軟件安裝和環(huán)境配置工作。另一方面,被測試軟件容器化封裝成容器鏡像后,可以極大提高軟件的可移植性和可重現(xiàn)性,在支持容器運行的環(huán)境下,基于容器鏡像即可復(fù)現(xiàn)與軟件開發(fā)環(huán)境一致的測試環(huán)境,有效地保持軟件“開發(fā)-測試-生產(chǎn)”環(huán)境的一致性[9],避免因軟件配置和環(huán)境差異引發(fā)的軟件錯誤。圖2為基于Docker的軟件交付與部署示意圖。
(2)優(yōu)化軟件測試基礎(chǔ)設(shè)施搭建方式。
容器化后的被測試軟件在支持容器運行環(huán)境下即可部署運行,基于搭建的FCC-ST平臺能夠十分靈活迅速地搭建軟件測試所需的基礎(chǔ)設(shè)施環(huán)境。FCC-ST支持物理節(jié)點的動態(tài)加入和刪除操作,在FCC-ST的Web管理界面即可完成所有環(huán)境搭建過程,較于創(chuàng)建/銷毀虛擬機方式搭建集群環(huán)境更高效,物理資源利用率更高。FCC-ST同時支持容器化被測試軟件的一鍵部署,在軟件部署的配置文件中寫好配置信息,F(xiàn)CC-ST就可以根據(jù)設(shè)置好的配置信息將被測試軟件自動部署到預(yù)設(shè)節(jié)點上,不需要過多的人工干預(yù),十分的高效。
圖1 軟件測試流程
圖2 基于Docker的軟件交付與部署示意
(3)優(yōu)化測試工具使用方式。
軟件測試工具大多都需要復(fù)雜的安裝和配置才可使用,如Junit、Jmeter等[10],對剛接觸的新手并不友好。利用Docker將測試工具及其依賴環(huán)境容器化封裝成容器鏡像,存儲到FCC-ST中的Private Registry中,測試人員在需要使用測試工具時,直接在Private Registry中拉取相應(yīng)容器鏡像并新建容器即可使用,省去了復(fù)雜的安裝和配置過程,“一勞永逸”。將測試工具容器化,能夠幫助測試人員高效地使用軟件測試工具,即用即取,有效提高測試效率。
(4)優(yōu)化軟件可伸縮性測試方法。
可伸縮性[11-12]是分布式軟件的一個重要特性,可伸縮性測試的目的是測試軟件在擴展到很多物理節(jié)點上運行時,其功能指標(biāo)是否正常。目前的測試方法都是基于虛擬機,由于虛擬機是一種十分笨重的虛擬化技術(shù)[13],在有限的物理資源條件下無法開展大規(guī)模節(jié)點的可伸縮性測試,因而極大地降低了軟件測試在應(yīng)用大規(guī)模部署場景下的缺陷檢測能力。
憑借Docker容器技術(shù)輕量、隔離和快速部署的特點,提出基于容器節(jié)點擴展的可伸縮性測試方法,將被測試軟件及其依賴環(huán)境容器化封裝為容器鏡像,并部署在FCC-ST平臺上,直接基于容器鏡像批量新建大量容器來完成軟件節(jié)點的擴展。這種方式憑借容器技術(shù)輕量、快速的特點,可以在有限物理資源條件下開展大規(guī)模的可伸縮性測試并節(jié)約大量測試時間,有效地降低軟件測試成本,提高了軟件測試的缺陷檢測能力。
圖3為軟件可伸縮性測試優(yōu)化示意圖。
圖3 軟件可伸縮性測試優(yōu)化示意
實驗基于以下實驗環(huán)境:物理機型號為Mac Pro,操作系統(tǒng)為macOS Sierra 10.12.1,處理器為3.5 GHz 6-Core Intel Xeon E5,顯卡為AMD FirePro D300 2048 MB,內(nèi)存為32 GB 1866 MHz DDR3,虛擬系統(tǒng)軟件為VirtualBox 5.1.30,虛擬機系統(tǒng)版本為Ubuntu 16.04。
實驗1對文中搭建的FCC-ST平臺的性能進(jìn)行測試,對比物理機裸機和虛擬機,使用LinpackMPI測試工具測試其性能損耗。實驗2為基于大數(shù)據(jù)基礎(chǔ)軟件Hadoop節(jié)點擴展測試實驗,對基于容器節(jié)點擴展的軟件可伸縮性測試方法和基于虛擬機的可伸縮性測試方法進(jìn)行對比測試,驗證優(yōu)化方法的有效性。
實驗1:FCC-ST、Native和VM計算性能對比測試。
FCC-ST平臺和VM都是搭建在裸機(Native)之上的,使用LinpackMPI測試工具對FCC-ST平臺、Native和VM環(huán)境下的CPU浮點計算能力進(jìn)行測試,并在實驗過程中將VM和容器的資源使用限制解除。該實驗參考了文獻(xiàn)[14]中的測試方法和步驟。
測試結(jié)果如圖4所示。
圖4 性能測試對比
由實驗結(jié)果可知,F(xiàn)CC-ST容器云平臺的計算性能幾乎與物理裸機相當(dāng),只有很少的計算性能損耗,而虛擬機計算性能損耗甚至超過50%。分析原因是虛擬機本身需要模擬整個操作系統(tǒng)層,開銷很大,而FCC-ST是基于容器構(gòu)建,是操作系統(tǒng)級的虛擬化,沒有硬件模擬層消耗,因此幾乎沒有計算性能損耗,與裸機計算性能相差無幾。
實驗2:大數(shù)據(jù)系統(tǒng)基礎(chǔ)軟件Hadoop的軟件節(jié)點擴展測試。
對大數(shù)據(jù)系統(tǒng)基礎(chǔ)軟件Hadoop進(jìn)行伸縮性測試,基于下述兩種方式完成大數(shù)據(jù)系統(tǒng)基礎(chǔ)軟件Hadoop的軟件節(jié)點擴展。
1.基于虛擬機方式。
(1)在虛擬機內(nèi)部安裝和配置Hadoop軟件;
(2)在物理機上克隆已經(jīng)安裝配置好Hadoop軟件的虛擬機;
(3)修改虛擬機內(nèi)部的配置文件,包括IP地址和Host文件等;
(4)完成Hadoop節(jié)點擴展。
2.基于容器節(jié)點擴展方式。
(1)利用Docker的鏡像構(gòu)建命令,將Hadoop及其依賴的運行時環(huán)境封裝成容器鏡像;
(2)基于容器鏡像在FCC-ST平臺上部署Hadoop;
(3)新建Hadoop Master容器節(jié)點和Slave容器節(jié)點,shell程序代碼如下所示;
# N is the node number of hadoop cluster
#start hadoop mater container
sudo docker run -itd --net=hadoop -p 40058:40058 -p 8088:8088 --name hadoop-master --hostname hadoop-master scaleTest/hadoop:1.0 &> /dev/null
#start hadoop slave container
i=1
while[ $i -lt $N ]
do
echo “start hadoop-slave$i container”
sudo docker run -itd --net=hadoop -p 40058:40058 -p 8088:8088 --name hadoop-slave$i --hostname hadoop-slave$i scaleTest/hadoop:1.0 &> /dev/null
i=$(($i+1))
done
(4)完成Hadoop節(jié)點擴展。
表1 大數(shù)據(jù)系統(tǒng)基礎(chǔ)軟件Hadoop節(jié)點擴展測試結(jié)果
注:“—”表示在文中實驗環(huán)境下無法進(jìn)行測試
表1為實驗測試結(jié)果,虛擬機由于物理資源消耗大,是比較重載的虛擬化技術(shù),在文中實驗環(huán)境下,只能支持?jǐn)U展20個節(jié)點。而基于FCC-ST平臺,憑借Docker容器技術(shù)的輕量、高效特點,Hadoop可以擴展數(shù)千甚至上萬節(jié)點[15]。圖5為兩種擴展方式耗時對比??梢钥闯觯贔CC-ST平臺的擴展方式優(yōu)勢十分明顯,不僅能在有限物理資源條件下開展比虛擬機方式更大規(guī)模的可伸縮性測試,而且在時間消耗上最少只需要虛擬機方式的百分之一,十分高效。
圖5 兩種擴展方式耗時對比
由實驗1可知,基于Docker搭建的FCC-ST平臺相比于虛擬機,更輕量、靈活,開銷更小,資源利用率更高。FCC-ST容器云平臺兼具了虛擬機的隔離性優(yōu)勢和幾乎物理機裸機的計算性能。實驗2通過兩種擴展方式的對比測試,基于容器節(jié)點擴展的軟件可伸縮性測試方法克服了基于虛擬機擴展方式的笨重和資源開銷大等缺點,在時間和資源利用率方面優(yōu)化效果十分顯著,驗證了文中提出的基于容器節(jié)點擴展的可伸縮性測試方法的有效性和優(yōu)越性。
分析了軟件測試工作目前面臨的問題,給出了相關(guān)研究,并基于Docker容器技術(shù)和FCC-ST平臺對軟件測試過程中的被測試軟件的交付和安裝部署方法、軟件測試基礎(chǔ)設(shè)施搭建方式、測試工具使用和軟件可伸縮性測試方法進(jìn)行了優(yōu)化,并通過實驗驗證了優(yōu)化方法的有效性。該研究工作具有一定的實用價值,能夠在一定程度上提高軟件測試效率和軟件測試的缺陷檢測能力,同時也可以給軟件測試優(yōu)化工作提供一定的啟發(fā)和參考。基于容器技術(shù)設(shè)計一套完善的容器化軟件測評工作流是下一步的研究方向。