前言
在接口自動化完工后,測試需要思考的一個問題是能夠讓自動化項目掛載到公司的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 -i http://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鏡像