【接口自动化】 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镜像

原文地址:https://www.cnblogs.com/Ronaldo-HD/p/14074360.html