Docker 與自動(dòng)化測(cè)試
對(duì)于重復(fù)枯燥的手動(dòng)測(cè)試任務(wù),可以考慮將其進(jìn)行自動(dòng)化改造。自動(dòng)化的成本在于自動(dòng)化程序的編寫(xiě)和維護(hù)号醉,而收益在于節(jié)省了手動(dòng)執(zhí)行用例的時(shí)間。簡(jiǎn)而言之辛块,如果收益大于成本畔派,測(cè)試任務(wù)就有價(jià)值自動(dòng)化,否則受益的只是測(cè)試人員的自動(dòng)化技能得到了提升润绵。利用 Docker 的快速部署线椰、環(huán)境共享等特性,可以大大減少自動(dòng)化的成本尘盼,使很多原本沒(méi)有價(jià)值自動(dòng)化的測(cè)試任務(wù)變?yōu)榱擞袃r(jià)值自動(dòng)化的任務(wù)憨愉,大大提升了項(xiàng)目效率烦绳。
那么如果自動(dòng)化測(cè)試已經(jīng)運(yùn)行在了虛擬機(jī)中,是否有必要使用 Docker 技術(shù)將其進(jìn)行改造配紫?這個(gè)就要具體問(wèn)題具體分析了径密。筆者并不贊同將所有測(cè)試任務(wù)一刀切的進(jìn)行容器化改造。如果當(dāng)前虛擬機(jī)已經(jīng)滿(mǎn)足測(cè)試需求躺孝,你就需要評(píng)估一下引入 Docker 進(jìn)行改造所需的成本享扔,其中包含學(xué)習(xí) Docker 技術(shù)所需要的時(shí)間成本。反之植袍,如果虛擬機(jī)無(wú)法滿(mǎn)足當(dāng)前的測(cè)試需求惧眠,可以考慮盡快引入 Docker 進(jìn)行改造。
Docker 的約束
Build, Ship, and Run Any App, Anywhere. 這是 Docker 公司高調(diào)宣稱(chēng)的口號(hào)奋单,即在任何平臺(tái)都可以構(gòu)建锉试、部署、運(yùn)行任何應(yīng)用览濒。然而呆盖,由于 Docker 自身的特點(diǎn),其使用場(chǎng)景有一些約束:
(1) 因?yàn)槿萜髋c主機(jī)共享內(nèi)核贷笛,如果容器中應(yīng)用需要不同的內(nèi)核版本应又,就不得不更換主機(jī)內(nèi)核。但如果主機(jī)內(nèi)核變更后又會(huì)影響到其它容器的運(yùn)行乏苦。變通的方法是將應(yīng)用源碼的編寫(xiě)與內(nèi)核特性解耦株扛。
(2)Docker 使用時(shí)需要 3.10 或以上版本的內(nèi)核,這是最低的限制汇荐。如果你需要使用更高級(jí)的 Docker 特性洞就,如 user namespace,那么還需要更高版本的內(nèi)核掀淘。
(3) 使用“--privileged”選項(xiàng)后可以在容器內(nèi)加載或卸載內(nèi)核模塊旬蟋,但這個(gè)操作會(huì)影響到主機(jī)和其它容器。
(4) 無(wú)法模擬不同平臺(tái)的運(yùn)行環(huán)境革娄,例如不能在 x86 系統(tǒng)中啟動(dòng) arm64 的容器倾贰。
(5) 因?yàn)?Docker 采用了 namespace 的方案來(lái)實(shí)現(xiàn)隔離,而這種隔離屬于軟件隔離拦惋,安全性不高匆浙。不適合安全性高的測(cè)試任務(wù)。
(6) 因?yàn)槟壳皼](méi)有 time namespace 技術(shù)厕妖,修改某個(gè)容器時(shí)間時(shí)就不得不影響到主機(jī)和其它容器首尼。
適用于 Docker 的測(cè)試場(chǎng)景
由于容器與主機(jī)共享內(nèi)核使用,凡是和內(nèi)核無(wú)強(qiáng)相關(guān)的測(cè)試任務(wù)是適合引入 Docker 進(jìn)行改造的,例如源碼編譯測(cè)試饰恕、軟件安裝測(cè)試挠羔、互聯(lián)網(wǎng)應(yīng)用測(cè)試、數(shù)據(jù)庫(kù)測(cè)試等埋嵌。而與內(nèi)核強(qiáng)相關(guān)的測(cè)試任務(wù)是不適合使用 Docker 進(jìn)行改造的破加,如內(nèi)核網(wǎng)絡(luò)模塊測(cè)試、內(nèi)核 namespace 特性測(cè)試等雹嗦。
Docker 測(cè)試實(shí)踐
容器化編譯系統(tǒng)測(cè)試
早期我們將 linux 發(fā)行版安裝到物理機(jī)中進(jìn)行測(cè)試范舀。當(dāng)需要重新進(jìn)行全量測(cè)試時(shí)不得不手動(dòng)還原測(cè)試環(huán)境。之后改用了虛擬機(jī)了罪,雖然能夠通過(guò)自動(dòng)化的方式實(shí)現(xiàn)環(huán)境還原锭环,但虛擬機(jī)的損耗較大,效率不高泊藕。
如果對(duì)軟件測(cè)試辅辩、接口測(cè)試、自動(dòng)化測(cè)試娃圆、性能測(cè)試玫锋、LR腳本開(kāi)發(fā)、面試經(jīng)驗(yàn)交流讼呢。感興趣可以175317069撩鹿,群內(nèi)會(huì)有不定期的發(fā)放免費(fèi)的資料鏈接,這些資料都是從各個(gè)技術(shù)網(wǎng)站搜集悦屏、整理出來(lái)的节沦,如果你有好的學(xué)習(xí)資料可以私聊發(fā)我,我會(huì)注明出處之后分享給大家础爬。
之后我們嘗試將環(huán)境制作成 Docker 鏡像甫贯,同時(shí)進(jìn)行了如下的改進(jìn):
(1) 通過(guò) Docker 的“-v”選項(xiàng),將主機(jī)目錄映射到容器中看蚜,實(shí)現(xiàn)多個(gè)容器共享測(cè)試代碼叫搁。測(cè)試代碼部署時(shí)間從 2 分鐘減少到 10 秒。
(2) 將大粒度的執(zhí)行時(shí)間較長(zhǎng)的用例拆分成為若干個(gè)小用例失乾。
(3) 利用容器并發(fā)執(zhí)行測(cè)試。
(4) 使用 Dockerfile 梳理產(chǎn)品依賴(lài)包和編譯軟件的安裝纬乍。
編譯系統(tǒng)測(cè)試是用戶(hù)態(tài)的測(cè)試碱茁,非常適合使用 Docker 進(jìn)行加速。如果需要針對(duì)某一個(gè) linux 發(fā)行版進(jìn)行測(cè)試仿贬,可以通過(guò) Docker 快速部署的特點(diǎn)纽竣,將所有的資源快速利用起來(lái),從而達(dá)到加速測(cè)試執(zhí)行的目的。
linux 外圍包測(cè)試
外圍包包含動(dòng)態(tài)鏈接庫(kù)文件和常用的命令行工具蜓氨,屬于 linux 操作系統(tǒng)的中間層聋袋,其上運(yùn)行著應(yīng)用程序,其下由 linux 內(nèi)核支撐穴吹。起初的外圍包測(cè)試采用串行執(zhí)行幽勒,效率不高。同時(shí)受到環(huán)境污染的影響港令,容易產(chǎn)生軟件缺陷的誤報(bào)啥容。在改進(jìn)方面,我們首先通過(guò) Dockerfile 基于 rootfs 制作一個(gè) Docker 鏡像顷霹,然后通過(guò) Docker-compose 工具實(shí)現(xiàn)測(cè)試用例的并發(fā)執(zhí)行咪惠。
以下是改進(jìn)前后的對(duì)比。
通過(guò) Docker 進(jìn)行測(cè)試加速的原理
Docker 本身并不會(huì)直接加速測(cè)試執(zhí)行淋淀。在串行執(zhí)行測(cè)試時(shí)遥昧,在容器中執(zhí)行測(cè)試反而會(huì)帶來(lái)約 5% 左右的性能衰減。但我們可以充分利用 Docker 快速部署朵纷、環(huán)境共享等特性炭臭,同時(shí)配合容器云來(lái)快速提供所需的測(cè)試資源,以應(yīng)對(duì)測(cè)試任務(wù)的峰值柴罐。如果忽略環(huán)境部署時(shí)間徽缚,當(dāng)每個(gè)測(cè)試用例粒度無(wú)限小并且提供的測(cè)試資源無(wú)限多時(shí),測(cè)試執(zhí)行所需的時(shí)間也就無(wú)限小革屠。