【接口自動化】 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 -i  http://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鏡像

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM