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

背景

目標:使用docker作UI自動化測試並在Jenkins運行python

調試環境:MocOSgit

運行環境:Linux ubuntu + dockergithub

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

基本思路

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

鏡像倉庫地址:docker

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

接下來開工:瀏覽器

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,裏面大牛已經爲咱們整理好了許多的學習資料,有自動化,接口,性能等等的學習資料!

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

相關文章
相關標籤/搜索