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

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

關注二維碼
無意中發現了一個巨牛的人工智能教程,忍不住分享一下給大家。教程不僅是零基礎,通俗易懂,而且非常風趣幽默,像看小說一樣!覺得太牛了,所以分享給大家。點這裏可以跳轉到教程。

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

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

  1. setup
  2. do testing
  3. 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 mysql
docker run -d --name mysql -p 33060:3306 mysql:latest
# 數據庫初始化測試基礎數據
docker cp 96f7f14e99ab:/var/lib/mysql /data/docker/mysql-base
docker stop 96f7f14e99ab
docker rm 96f7f14e99ab
docker 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/mysql4testing
cp /data/docker/mysql-base /data/docker/mysql4testing
docker run -d -v /data/docker/mysql4testing:/var/lib/mysql --name mysql -p 3307:3306 mysql:latest
# do testing
docker stop 96f7f14e99ad
docker rm 96f7f14e99ad

修改Dockerfile

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

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

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

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

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

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

關注二維碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章