1. 程式人生 > 實用技巧 >【介面自動化】 Pytest+Allure+Request +docker+jenkins 映象構建記錄

【介面自動化】 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}

這裡有幾個注意點:

  1. 選擇基礎映象,這裡我選的是和我本地對應的python 3.7.5 按照專案實際情況選取即可
  2. 構造獨立映象與依賴,但是要避免每次構建都去pull依賴,那樣就是浪費資源; 這裡也可以在pip的時候指定國內映象,不再贅述e.g. pip install -ihttp://mirrors.aliyun.com/pypi/simple/numpy 這是臨時指定映象地址
  3. 執行專案引數化,注意要事先宣告變數ARG或者環境變數ENV,後續需要從jenkins裡面傳遞過來
  4. 解決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映象