如何通過Docker管理自動化測試數據

  • 2019 年 11 月 24 日
  • 筆記

如何通過Docker管理自動化測試數據

我們知道自動化測試都會有前提準備的步驟,而這個環節一般都是基礎數據的準備。本文將會介紹如何通過Docker來管理基於Mysql的測試數據。

通常自動化用例執行的步驟大概如下:

1.setup2.do testing3.teardown

其中setupteardown就是給正式測試做前提準備和收尾的工作,而數據的準備和恢復就經常會出現在這2個環節。對於少量的數據可以通過mysql快速恢復,或者乾脆直接生造出來;但是當數據量太大或者數據結構變複雜的情況,就需要一種快速的數據恢復機制。

如今的技術中,能夠實現快速恢復又簡單方便的技術自然就要選Docker了。雖然Docker並不是為了測試技術而生的,但是卻天然有著獨屬於測試的基因。

方案選定

通過Docker實現數據環境的恢復有很多種場景,這裡主要講的是恢復mysql數據的場景。在Dockerhub上可以直接拉去mysql的鏡像,但是卻不能直接滿足我們的需求。

主要原因是官方提供的mysql鏡像默認會把mysql的數據目錄映射到宿主機中,並且即使你進行數據變更後再commit鏡像,重啟後依然會使用新的宿主機的映射路徑。導致每次重啟容器都沒有保留之前DB中執行的變更。

為了解決這個問題,實現從特定的鏡像啟動容器時,容器內能夠保留我們預定的基準測試數據。這裡有2種方案:

1.啟動容器時掛載一個指定的宿主機路徑作為mysql的數據目錄2.通過修改後的mysql的Dockerfile來構建鏡像,不把mysql數據目錄掛載到宿主機

這2種方式都是可以實現我們的目標,方案1的好處是由於我們的數據目錄在宿主機上,所以即使哪天鏡像被刪除或者docker出問題了,但數據不會丟失;方案2的優點是操作更加簡單和快速,符合常規的Docker操作場景。

指定掛載目錄

由於官方提供的mysql鏡像,在構建的時候通過volume來掛載mysql的數據目錄;所以每次新啟動的時候,都會重新使用新的宿主機目錄來進行掛載,導致容器中的mysql變更不能被保存下來。

為了能夠實現目錄,該方案的具體步驟如下:

1.通過mysql官方鏡像啟動容器2.對mysql容器進行數據初始化操作3.複製容器中的mysql數據目錄到宿主機路徑4.停止mysql容器並刪除容器5.再次通過mysql官方鏡像啟動容器,並掛載之前複製到宿主機的mysql數據目錄

通過上述步驟之後,再次的啟動容器,之前變更的mysql數據就會被正常的保留。具體的操作命令如下:

docker pull mysqldocker run -d --name mysql -p 33060:3306 mysql:latest# 資料庫初始化測試基礎數據docker cp 96f7f14e99ab:/var/lib/mysql /data/docker/mysql-basedocker stop 96f7f14e99abdocker rm 96f7f14e99abdocker run -d -v /data/docker/mysql-base:/var/lib/mysql --name mysql -p 33060:3306 mysql:latest

上述命令中,假設第一次啟動的容器id為96f7f14e99ab。

正式測試的時候,則需要先複製一份mysql的基礎數據目錄,然後在啟動的時候掛載這個備份的mysql數據目錄即可。具體命令如下:

rm -fR /data/docker/mysql4testingcp /data/docker/mysql-base /data/docker/mysql4testingdocker run -d -v /data/docker/mysql4testing:/var/lib/mysql --name mysql -p 3307:3306 mysql:latest# do testingdocker stop 96f7f14e99addocker rm 96f7f14e99ad

修改Dockerfile

第一種方法雖然可以滿足需求,但是需要每次都額外的cp一次mysql數據目錄;如果想避免種操作,通過下面的步驟同樣也可以實現:

1.下載官方mysql的Dockerfile2.注釋掉Dockerfile中volume /var/lib/mysql的那一行3.本地構建mysql鏡像4.通過該鏡像啟動mysql容器5.對mysql容器進行數據初始化操作6.提交mysql容器變更並標誌為新tag7.停止並刪除mysql容器8.通過新的mysql鏡像啟動容器

最後啟動的mysql容器,也會保留之前的資料庫中的變更資訊,以後每次想要恢復資料庫,也只要重新啟動一個新的容器即可。上述步驟對應的命令如下:

git clone https://github.com/mysql/mysql-dockercd mysql-docker/5.7sed 's/VOLUME /var/lib/mysql/# VOLUME /var/lib/mysql/' Dockerfiledoker build -f mysql:base .docker run -d --name mysql -p 33060:3306 mysql:base  # container id: 96f7f14e99ab# 進行測試數據初始化操作docker commit -m "init database" 96f7f14e99ab mysql:initdocker stop 96f7f14e99abdocker rm 96f7f14e99abdocker run -d --name mysql -p 3307:3306 mysql:init

選擇這種方案之後,正常執行自動化測試時,只需要每次重新啟動一個容器就可以了。示例命令如下:

docker run -d --name mysql -p 3307:3306 mysql:init  # container id:96f7f14e99ad# do testingdocker stop 96f7f14e99addocker rm 96f7f14e99ad