【介面自動化】 Pytest+Allure+Request +docker+jenkins 映象構建記錄
前言
在介面自動化完工後,測試需要思考的一個問題是能夠讓自動化專案掛載到公司的CICD流程中去,本文選用的是最通用的docker映象方式,構建走jenkins
準備條件
- 專案已經基本完工或者已經能執行,別隻做個demo就開始打映象
- 程式碼上傳到git/gitlab 等程式碼倉庫
- 公司具備物理機能支撐docker映象
- jenkins具備管理員許可權,安裝allure外掛,並進行相關配置
構建Docker映象
如何將專案構建成docker 映象,網上其實很多方法,這裡只提供一種
# 基於的基礎映象 FROM python:3.7.5 #製作者資訊 MAINTAINER XXX # 程式碼新增到code資料夾 #ADD . /code # 設定code資料夾是工作目錄 ARG env ARG project
# 使用快取的方式安裝依賴,如果requirements沒有變化不會拉取 WORKDIR /src ADD ./requirements.txt /src/requirements.txt RUN pip install -r requirements.txt ADD . /src #CMD python /src/run.py #ENV ALLURE_PATH=/src/doc/allure-commandline-2.13.0/package/bin/allure # 安裝支援 #RUN pip install -r requirements.txt
# 賦權+執行指令碼RUN chmod a+x /src/* CMD python /src/run.py ${env} ${project}
這裡有幾個注意點:
- 選擇基礎映象,這裡我選的是和我本地對應的python 3.7.5 按照專案實際情況選取即可
- 構造獨立映象與依賴,但是要避免每次構建都去pull依賴,那樣就是浪費資源; 這裡也可以在pip的時候指定國內映象,不再贅述e.g. pip install -ihttp://mirrors.aliyun.com/pypi/simple/numpy 這是臨時指定映象地址
- 執行專案引數化,注意要事先宣告變數ARG或者環境變數ENV,後續需要從jenkins裡面傳遞過來
- 解決allure 的各種異常情況
解決Allure的各種異常情況:
1.unrecognized arguments: --alluredir=reports
報錯:
解決方案:【pytest.main 的方式去執行命令】
import pytest if __name__ == '__main__': command_line = ["-s", "./tests/test1/test1.py", "--alluredir=report"] pytest.main(command_line)
2. 映象打包完成後,返回 allure 是不認識的命令,原因是你本地安裝了allure 外掛,但是映象裡面沒有
解決方案:
1. 映象裡面也安裝allure ,然後設定環境變數,軟鏈等方式能呼叫(該方式我沒有成功)
2. 利用jenkins裡面的allure外掛進行報告獲取,使用這種方式的前提是你的程式碼裡面沒有使用如下命令:
os.system('allure generate {path_allure} -o {path_html} --clean'.format(path_allure=docker_xml_path, path_html=docker_html_path))
Jenkins 的配置
1. 構造引數:
2. 構建進行的時候一個shell模板,注意這裡使用的引數是步驟1裡面設定的
echo ${ENV} ${PROJECT} cat Dockerfile # stop image c=`docker ps -a | grep auto | awk '{print $1}'` r_img=`docker images | grep auto | awk '{print $3 }'` # 如果容器正在執行,停止它 if [ "$c"x != ""x ]; then docker stop "$c" docker rm "$c" -f fi # 刪除映象 #if [ "$r_img"x != ""x ]; then #docker rmi "$r_img" #fi #構建docker docker build -t autotest:v${VERSION} -f Dockerfile . # run docker docker run --name cdn-console-autotest -e env=${ENV} -e project=${PROJECT} -v ${PWD}/report/allure_reports:/src/report/allure-results autotest:v${VERSION}
3. 構建後生成Allure 報告,注意這裡的路徑需要真實存在,且在步驟2裡面的shell腳本里面定義了
4. 構建的時候: (這樣就實現了: 任意專案,任意環境下執行介面自動化操作 // 當然這個需要自動化程式碼層面進行支撐)
5. 當然構建後可以去docker進行裡面檢視進行執行情況,這裡不再贅述
一些擴充套件或想法
介面自動化實現了任意環境,任意專案; 我這裡採用的方式是引數隔離的方式,讀取不同的yaml檔案來執行, 大致可以分成幾個檔案:
1. 基礎資訊檔案 base.yaml [存放host, 以及環境的基本資訊]
2. 賬號基礎檔案 account.yaml [存放賬號資訊]
3. 介面資訊檔案 api.yaml [存放介面uri]
那麼 1 和2 就是有多少個環境就有多少份, 保證他們的key值一致即可。 3只有一份,因為針對同一個專案,介面是一樣的。
如果你有多個專案,直接用這個模式複製即可。
打包成Docker映象的好處:
1. 執行環境獨立, 不用再依賴任何環境,只要你部署的物理機能夠聯通你需要執行的環境就行,隨時可以複製多個映象
例子: 5臺物理機部署60個映象,可以在60個環境下執行你的用例,分散式可以參考grid, 當然目前我還未用到
2. 可擴充套件性太強, 隨時可以把映象改造成適配K8S,放到公司叢集環境或者任意環境下進行轉移
網上大部分的介面自動化都是打通了Jenkins ,但是沒有構造Docker映象