前言
在接口自动化完工后,测试需要思考的一个问题是能够让自动化项目挂载到公司的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镜像