1 pytest+allure自动化测试框架

1.1 pytest安装

1.2 allure安装

下载allure后扔到D盘,并且配置环境变量path,如下:
在这里插入图片描述

1.2 框架编写

目录结构如下:
在这里插入图片描述

  1. data 存放测试用例(xls)、测试文件数据(上传的文件)、测试结果文件(xls)、下载的文件
  2. log 日志保存路径
  3. report allure报告保存路径
  4. result allure测试结果保存路径
  5. testcase 测试用例类
  6. util 工具类
  7. run.py 入口文件

1.2.1 框架设计思路

在这里插入图片描述

  1. 测试用例xls中保存测试用例编号、用例名称、请求方式(post、get)、url、header、param、body、检查点、用例类型、关联
  2. 通过工具类的readXlsUtil获取单个sheet中的数据组成一个list
  3. 通过@pytest.mark.parametrize('data', caseData, ids=caseNames)注解实现数据驱动
  4. 通过工具类的JsonPah来获取响应中的值保存起来,以备关联使用
  5. 通过工具类的Replace来替换请求url、header、param、body中的参数
  6. 通过工具类的baseApi.sendRequest实现http请求
  7. 通过工具类的baseApi.writeResult实现结果xls保存

1.2.2 项目源码

见github:https://github.com/suheping/pytest_auto_plat

1.2.3 核心代码

我们的接口测试类无特殊情况只需要用着一个就够了,不需要一个功能写一个类
test_api.py

# -*- encoding: utf-8 -*-
'''
@File    :   test_api.py
@Time    :   2020/12/18 11:55:48
@Author  :   peace_su
@Version :   1.0
@Contact :   peace_su@163.com
@WebSite :   https://me.csdn.net/u010098760
'''

# here put the import lib
import pytest
import allure
import requests
from util import readXlsUtil, logUtil
from util.baseApi import sendRequest, writeResult
from util.jsonPah import JsonPah
from util.replace import Replace
from util.copyXls import copyXls
from util.genSign import GenSign

# 用例路径
# caseXls = 'E:\pyworkspace\pytest_demo\data\case1.xlsx'
caseXls = 'data\case1.xlsx'
rxls = readXlsUtil.readXlsUtil(caseXls, 'Sheet1')
# 获取type为1的测试用例
caseData = rxls.dict_data(1)
# 获取用例名称
caseNames = rxls.dict_name(caseData)
# 测试结果文件
# reportXls = 'E:\pyworkspace\pytest_demo\data\case1_report.xlsx'
reportXls = 'data\case1_report.xlsx'
copyXls(caseXls, reportXls)


@allure.feature('测试某个功能')
class Test_api(object):

    def setup_class(self):
        self.logger = logUtil.Log('test_api').getlogger()
        self.tmp = {}
        self.session = requests.session()

    # @allure.story('查询企业信息')
    @pytest.mark.parametrize('data', caseData, ids=caseNames)
    def testApi(self, data):  # test method names begin with 'test'
        self.logger.info(
            '----用例[ %s ]------begin-------------' % data['caseId'])
        if self.tmp != {}:
            # 如果有关联参数,替换body、params、url、headers
            data['body'] = Replace(data['body'], self.tmp).replace()
            # 计算sign
            sign = GenSign('vtysJXstynJpIlEudO').genSign(data['body'])
            self.tmp['sign'] = sign
            data['params'] = Replace(data['params'], self.tmp).replace()
            data['url'] = Replace(data['url'], self.tmp).replace()
            data['headers'] = Replace(data['headers'], self.tmp).replace()
        # 发送请求
        result = sendRequest(self.session, data)
        # 如果存在re,就去响应中查找,找到后存到tmp中
        if data['re']:
            t = JsonPah(result['text'])
            param = t.jsonFind(data['re'])
            for j in param:
                self.tmp[j] = param[j]
        self.logger.info('保存的关联参数为:%s' % self.tmp)
        # 写结果
        writeResult(result, reportXls)
        # 开始断言
        assert result['result'] == 'pass'
        self.logger.info('----用例[ %s ]------end-------------' % data['caseId'])


if __name__ == '__main__':
    pytest.main(["--reruns", "1", "--reruns-delay",
                 "2", "--alluredir", "result"])

1.2.4 关联数据保存

关联数据的读取是个比较关键的点,比如返回的json中有多层,而且有重复的key值,怎么办?
举例说明:
返回的json如下:

{
    "return_code": "1000",
    "return_message": "success",
    "result_code": "0",
    "result_message": "处理成功",
    "access_token": 123,
    "data": [{
        "access_token": "456",
        "scope": "token",
        "token_type": "bearer",
        "expires_in": 69272
    },
    {
        "access_token": "789",
        "scope": "token",
        "token_type": "bearer",
        "expires_in": 69272
    }]
}

我们要取到值为“789”的accesss_token,我们xls中re字段怎么写呢?
如下:(下标是从0开始的)

{"token":"access_token[2]"}

这个意思就是将返回的 access_token保存到token变量中

1.2.5 关联数据替换

上一步中我们把响应中的数据保存下来了,怎么应用到之后的请求中呢?
我们只需要在xls用例的url、param、body、header中使用如下方式即可:
我们要在header中传入token,只需要把token的值改为${token}即可

{"Content-Type":"application/json","sign":"${sign}","token":"${token}"}

2 jenkins持续集成

jenkins搭建在windows环境下
注:十分重要
在jenkins中执行python run.py会报各种各样的错误,但是在cmd中正常,这是因为jenkins启动用户权限的问题,在服务中找到jenkins,右键属性-登录tab,填写cmd中可正常执行的用户,如下:

在这里插入图片描述

2.1 jenkins搭建

官网下载windows的安装包,一直下一步即可

2.2 jenkins工作目录更改

默认jenkins的工作目录在c盘windows。。。。一个很深的目录下,我们需要把他挪出来,步骤如下:

  1. 找到jenkins安装目录下的jenkins.xml文件,打开
  2. 找到 <env name="JENKINS_HOME" value="xxxx,修改value的值为你自己要放的位置
  3. 重启jenkins,服务中重启或者在安装目录下执行jenkins.exe stop jenkins.exe start
  4. 启动后重新配置jenkins

2.3 jenkins安装allure插件

  1. jenkins的插件管理中搜索 allure,安装
  2. jenkins的 Global Tool Configuration中最下方配置Allure Commandline,如下:
    在这里插入图片描述

3 创建job

  1. 先新建一个job,自由风格即可

  2. 源码管理中选择git,拉取源码,如下:
    在这里插入图片描述

  3. 构建中选择cmd,如下:
    在这里插入图片描述

  4. 构建后操作 中选择allure report,如下:
    在这里插入图片描述
    注:path必须是result,因为我们run.py代码里写的结果保存路径就是result

  5. 点击高级,添加如下配置:(report path可以随意填写)
    在这里插入图片描述

  6. 应用、保存

4 构建job

  1. 点击build now,开始构建
  2. 构建完成后,我们点击 allure report即可跳到保存页面
    在这里插入图片描述
  3. 报告如下:
    在这里插入图片描述

齐活

5 锦上添花

5.1 配置个钉钉通知

  1. 找个钉钉群,加个钉钉机器人
  2. jenkins中安装插件DingTalk
  3. jenkins的 configure system中配置钉钉机器人的webhook、关键字或者加密
  4. 进入job中勾选上刚刚添加的机器人
  5. 构建一下,钉钉群收到通知

在这里插入图片描述

6 重要更新(jenkins构建时上传测试用例)

一个测试平台,代码跟测试用例肯定是分开的,我们可以通过jenkins构建时上传测试用例文件来实现这一个功能,接下来说一下怎么实现:

6.1 修改入口文件run.py

修改run.py为接收命令行入参,参数有两个(测试用例路径、测试结果文件路径),如下:

import sys
import pytest
from util import glb

def main(argv):
    glb.xls_path = argv[1]
    glb.xls_report_path = argv[2]
    pytest.main(["--reruns", "1", "--reruns-delay",
                 "2", "--alluredir", "result"])


if __name__ == '__main__':
    main(sys.argv)

6.2 修改glb.py和test_api.py

修改glb.py,传递两个参数(测试用例路径、测试结果文件路径)

# 要执行的用例文件路径,eg: data\case1.xlsx
xls_path = ''
# 要保持的结果文件的路径,eg: data\case1_report.xls
xls_report_path = ''

修改test_api.py,接收两个参数(测试用例路径、测试结果文件路径)

# 用例路径
# caseXls = 'data\case1.xlsx'
# caseXls = 'data\\case1.xlsx'
caseXls = glb.xls_path

# 测试结果文件
# reportXls = 'data\case1_report.xlsx'
# reportXls = 'data\\case1_report.xlsx'
reportXls = glb.xls_report_path

6.3 修改jenkins的job

设置构建时上传文件,如下:
在这里插入图片描述
修改构建脚本,如下:
在这里插入图片描述
第一个参数需要与构建参数中的文件路径相同
第二个参数是保存的结果文件

6.4 构建下看效果

构建界面,如下:
在这里插入图片描述
选择测试用例文件后,点击“开始构建”,查看构建日志,如下:
在这里插入图片描述
完成!


快来联系我吧
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐