1. 程式人生 > >Docker + selenium + jenkins 並行跑自動化測試

Docker + selenium + jenkins 並行跑自動化測試

背景

目標:使用docker做UI自動化測試並在Jenkins執行

除錯環境:MocOS

執行環境:Linux ubuntu + docker

涉及工具:docker,selenium,unittest, jenkins

基本思路

找一個適合做自動化的docker映象,使用selenium-grid 遠端執行selenium。映象採用 elgalu/selenium,已經集成了UI,chrome/firefox 等瀏覽器,包括webdriver驅動,十分方便。

映象倉庫地址:

https://github.com/elgalu/docker-selenium

接下來開工:

1. 在elgalu/selenium基礎上簡單編譯

為了方便,指令碼程式碼執行也設定在映象裡面。因此定製了我們自己的映象檔案:

FROM elgalu/selenium
RUN sudo apt-get update -y \
&& sudo pip install selenium \
&& mkdir /home/seluser/automation/myScript
ADD . /home/seluser/automation/myScript 
WORKDIR /home/seluser/automation/myScript  #定義工作目錄

2. 用Python+selenium編寫測試用例

if REMOTE:  # 定義一個開關變數方便本地和遠端除錯切換
    selenium_grid_url = "http://guest.docker:24444/wd/hub"
    capabilities = webdriver.DesiredCapabilities.CHROME.copy()
    d = webdriver.Remote(command_executor=selenium_grid_url, desired_capabilities=capabilities) #通過selenium啟動docker裡面chrome 
else:
    d = webdriver.Chrome()  #通過selenium啟動本地chrome
    ##具體的UI測試程式碼

此處是啟動selenium或者或者selenium -grid 部分主要程式碼,不能直接執行。如果需要呼叫遠端的selenium_grid需要URL加埠號的形勢http://guest.docker:24444/wd/hub,guest.docker是docker內網分配的IP,因為在docker裡面的host檔案沒有發現容器名和IP的對映,因此從docker裡面hosts檔案選用guest.docker這個名字,等發現更好解決方案後再更新。

3. 執行和除錯

本地除錯不再多說,主要說一下怎麼在docker除錯和執行。先啟動容器:

執行命令 :

docker* run --rm -p 5904:25900 -p 4444:24444 -v "$(pwd)":/home/seluser/automation/myScript --name automation-container automation-test:latest

啟動成功之後可以通過vnc工具檢視容器的UI介面

簡單說明一下引數,5904是VNC需要用到的埠,可以通過本地VNC(127.0.0.1:5904)工具檢視case執行效果。4444是selenium grid的對映埠。-v是把本地磁碟掛載到容器,方便程式碼除錯, 因為採用$(pwd),表示當前路徑,所以執行docker啟動命令時候應該在自動化指令碼所在位置。

現在本地除錯case,注意這個時候selenium_grid_url值應該是http://localhost:4444/wd/hub

最後在容器裡面執行case,可以通過docker exec名執行, 比如docker exec -it container_name python /home/seluser/automation/myScript/example.py 確認沒有沒有問題後可以上Jenkins測試

需要注意的是如果case執行失敗selenium grid是不會自動退出的,此處藉助Python unit test的teardown方法結束selenium程序,比如:

def tearDown(self):
       print("start to teardown")
       time.sleep(10)
       self.d.close()
       self.d.quit()

執行指令碼,可以再VNC看到執行效果:

4. 在Jenkins 執行

跟本地容器執行步驟一直,同樣的可以通過VNC監測執行過程。此處啟動容器和關閉容器單獨做成了兩個job,方便處理環境問題。

Jenkins上面執行docker exec -it時候碰到一個"The input device is not a TTY"錯誤。減少一個T引數可以解決。

jenkins 並行執行多個容器

因為我們是通過容器化的方式啟動的UI測試環境,同一個宿主機是可以啟動多個容器的。假設我們的UI測試用例比較多的時候,我們可以同時執行多個容器來減少UI case的執行時間,配置方式比jenkins的分散式執行又更方便,怎麼實現呢?啟動多個容器我們只需要改變容器名字和對映的埠號即可,比如把前面啟動容器命令簡單更新一下

docker run --rm -p 5906:25900 -p 4466:24444 -v "$(pwd)":/home/seluser/automation/myScript --name automation-container-robot -d automation-test-robot

此處我們只更新了埠(5906,4466)和容器名字,就能啟動多個UI環境並行執行case,是不是很爽哦?

執行完之後需要強制關閉容器,防止異常退出情況。啟動容器和關閉容器單獨做成了兩個job,方便處理環境問題。

 

到此處基本大功告成。

結語

 最後跟大家推薦一個測試學習群:747981058,裡面大牛已經為我們整理好了許多的學習資料,有自動化,介面,效能等等的學習資料!

人生是一個逆水行舟的過程,不進則退,咱們一起加油吧!