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

  • 相关阅读:
    数据结构之链表——加里森的任务(循环链表)
    数据结构之队列——回文字判断
    数据结构之栈——二进制转十进制
    《爱的艺术》人类超越了本能
    从一个Activity返回上一个Activity
    VS(C++)编程遇到的错误集合
    C++(MFC)编程一些注意事项
    Tomcat部署(进行web服务器开发)
    本地IP与宽带IP
    opencv的Mat图像显示在MFC控件中
  • 原文地址:https://www.cnblogs.com/Ronaldo-HD/p/14074360.html
Copyright © 2020-2023  润新知