ApiTesting全链路接口自动化测试框架

发表于:2021-2-26 09:28

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:LeoZhanggg    来源:博客园

  简介
  此框架是基于Python+Pytest+Requests+Allure+Yaml+Json实现全链路接口自动化测试
  主要流程:解析接口数据包 ->生成接口基础配置(yml) ->生成测试用例(yaml+json) ->生成测试脚本(.py) ->运行测试(pytest) ->生成测试报告(allure)。
  测试流程:初始化请求 ->处理接口基础信息 ->读取前置接口用例 ->发送前置接口 ->处理当前接口数据 ->发送当前接口  ->检查接口返回。
  接口自动化测试无非分几大块:测试用例设计、测试脚本编写、测试结果校验、测试报告生成、测试配置管理
  其中常见有几大难点:接口之间依赖关联、测试数据与脚本分离、测试数据参数化处理、全量自动化耗时。
  而这些本框架通通已为你解决,你无须编写任何代码,只需要你抓取接口数据包即可。
  关于接口依赖:你只要填写前置接口相对路径即可,如果存在数据依赖关系,此时你也仅需要填写前置接口对应的参数值,本框架将自动为你调用和替换关联数据。
  关于测试数据:本框架采用yaml记录接口基本信息,当请求参数和结果较大时,将单独保存到json文件中,解决各类数据的错综复杂问题。
  关于参数化:本框架采用常用工具使用的变量标识 ${var} ,通过正则表达式,自动检索变量,自动为你替换变量,并且为你提供多种函数助手【$RandInt()、$GenGuid()】为你解决测试数据生成问题。
  关于用例执行:本框架利用pytest扩展库,支持多线程模式、失败用例重试、用例模糊匹配等。
  目前主要支持四种运行模式:
  > 0 -不开启自动生成测试用例功能,将直接运行测试
  > 1 -根据手工编写用例,自动生成测试脚本,然后运行测试
  > 2 -根据接口抓包数据,自动生成测试用例和测试脚本,然后运行测试
  > 3 -根据接口抓包数据,自动生成测试用例和测试脚本,但不运行测试
  注意:目前解析仅支持(.chlsj)格式,请使用Charles工具抓包导出JSON Session File
  目前支持多种函数助手(以下仅为示例,之后将单独说明):
  print('替换变量并计算表达式:', replace('$Eval(${unitCode}*1000+1)', {'unitCode': 9876543210}))
  print('生成1-9之间的随机数:', replace('$RandInt(1,9)'))
  print('生成10位随机字符:', replace('$RandStr(10)'))
  print('从列表中随机选择:', replace('$RandChoice(a,b,c,d)'))
  print('生成一个伪手机号:', replace('$GenPhone()'))
  print('生成一个guid:', replace('$GenGuid()'))
  print('生成一个伪微信ID:', replace('$GenWxid()'))
  print('生成一个伪身份证:', replace('$GenNoid()'))
  print('生成一个18岁伪身份证:', replace("$GenNoid(y-18)"))
  print('生成下个月今天的日期:', replace("$GenDate(m+1)"))
  print('生成昨天此时的时间:', replace("$GenDatetime(d-1)"))

  替换变量并计算表达式: 9876543210
  生成1-9之间的随机数: 9
  生成10位随机字符: CB8512d4E6
  从列表中随机选择: d
  生成一个伪手机号: 18890688629
  生成一个guid: 78A6698C-6793-11EB-8221-005056C00008
  生成一个伪微信ID: AUTO9K6MRzVGfsNB4ZkIuSdXravD
  生成一个伪身份证: 999577202102052043
  生成一个18岁伪身份证: 953700200302056259
  生成下个月今天的日期: 2021-03-05
  生成昨天此时的时间: 2021-02-04 17:21:04.696745
  框架流程图
   
  项目结构
   
  执行入口(startup.py)
  # -*- coding:utf-8 -*-
  # @Time    : 2021/2/1
  # @Author  : Leo Zhang
  # @File    : startup.py
  # ***********************
  import os
  import sys
  import pytest
  import logging
  if __name__ == '__main__':
      from comm.script import writeLogs, writeCase
      from config import *
      # 开启日志记录(默认logs目录)
      writeLogs.MyLogs(ROOT_DIR+'logs')
      # 判断运行模式
      if RC['auto_switch'] == 3:
          logging.info("根据接口抓包数据,自动生成测试用例和测试脚本,但不运行测试!")
          writeCase.write_case(DATA_DIR, auto_yaml=True)
          sys.exit(0)
      elif RC['auto_switch'] == 2:
          logging.info("根据接口抓包数据,自动生成测试用例和测试脚本,然后运行测试!")
          writeCase.write_case(DATA_DIR, auto_yaml=True)
      elif RC['auto_switch'] == 1:
          # 如果扫描路径为空在则取项目page目录
          if not os.path.exists(RC['scan_dir']):
              RC['scan_dir'] = PAGE_DIR
          logging.info("根据手工编写用例,自动生成测试脚本,然后运行测试!")
          writeCase.write_case(RC['scan_dir'], auto_yaml=False)
      else:
          logging.info("不开启自动生成测试用例功能,将直接运行测试!")
      # 定义运行参数
      args_list = ['-vs', TEST_DIR,
                   '-n', str(RC['process']),
                   '--reruns', str(RC['reruns']),
                   '--maxfail', str(RC['maxfail']),
                   '--alluredir', REPORT_DIR+'/xml',
                   '--clean-alluredir']
      # 判断是否开启用例匹配
      if RC['pattern']:
          args_list += ['-k ' + str(RC['pattern'])]
      test_result = pytest.main(args_list)
      # 生成allure报告
      cmd = 'allure generate --clean %s -o %s ' % (REPORT_DIR+'/xml', REPORT_DIR+'/html')
      os.system(cmd)
  运行配置(runConfig.yml)
  # 运行项目名
  project_name: PyDemo
  # 运行模式:
  auto_switch: 2
  # 0 -不开启自动生成测试用例功能,将直接运行测试
  # 1 -根据手工编写用例,自动生成测试脚本,然后运行测试
  # 2 -根据接口抓包数据,自动生成测试用例和测试脚本,然后运行测试
  # 3 -根据接口抓包数据,自动生成测试用例和测试脚本,但不运行测试
  # 注意:目前解析仅支持(.chlsj)格式,请使用Charles工具抓包导出JSON Session File
  # 扫描测试用例目录(且仅当auto_switch=1时有用)
  scan_dir:
  # 使用模糊匹配测试用例(空则匹配所有)
  pattern:
  # 执行并发线程数(0表示不开启)
  process: 0
  # 失败重试次数(0表示不重试)
  reruns: 0
  # 本轮测试最大允许失败数(超出则立即结束测试)
  maxfail: 20
  # 接口调用间隔时间(s)
  interval: 1
  # 测试结果校验方式说明(共5种方式):
  # no_check:不做任何校验
  # check_code:仅校验接口返回码code
  # check_json:校验接口返回码code,并进行json格式比较返回结果(默认方式)
  # entirely_check:校验接口返回码code,并进行完整比较返回结果
  # regular_check:校验接口返回码code,并进行正则匹配返回结果
  测试脚本基础模板(test_template.py)
  # -*- coding:utf-8 -*-
  # @Time    : 2021/2/2
  # @Author  : Leo Zhang
  # @File    : test_template.py
  # ****************************
  import os
  import allure
  import pytest
  from comm.utils.readYaml import read_yaml_data
  from comm.unit.initializePremise import init_premise
  from comm.unit.apiSend import send_request
  from comm.unit.checkResult import check_result
  case_yaml = os.path.realpath(__file__).replace('testcase', 'page').replace('py', 'yaml')
  case_path = os.path.dirname(case_yaml)
  case_dict = read_yaml_data(case_yaml)
  @allure.feature(case_dict["test_info"]["title"])
  class TestTemplate:
      @pytest.mark.parametrize("case_data", case_dict["test_case"])
      @allure.story("test_template")
      def test_template(self, case_data):
          # 初始化请求:执行前置接口+替换关联变量
          test_info, case_data = init_premise(case_dict["test_info"], case_data, case_path)
          # 发送当前接口
          code, data = send_request(test_info, case_data)
          # 校验接口返回
          check_result(case_data, code, data)
  接口配置示例(apiConfig.yml) 
  PyDemo:
    host: 10.88.88.141:20037
    headers:
      Content-Type: application/x-www-form-urlencoded;charset=UTF-8
    cookies:
    headtoken: xu5YwIZFkVGczMn0H0rot2ps7zRIbvrTHNwMXx1sJXg=
  测试用例示例(findParam.yaml)
  test_info:
    title: register
    host: ${host}
    scheme: http
    method: POST
    address: /api/register/findParam
    mime_type: application/x-www-form-urlencoded
    headers: ${headers}
    timeout: 10
    file: false
    cookies: false
    premise: false
  test_case:
  - summary: findParam
    describe: test_findParam
    parameter:
      params:
        unitCode: '3202112002'
        first: 0
        pym: ''
        pageSize: 10
        page: 0
      headtoken: ${headtoken}
    check:
      check_type: check_json
      expected_code: 200
      expected_result:
        success: true
        code:
        msg: 返回成功
        data:
        - '1'
        - '1'
        callTime:
  测试报告示例(allure)
  实战演示
  1、首先环境准备:Python  + Allure (这里不做详细说明,请参考我Pytest分类博文)。
  接着下载项目:https://github.com/Leozhanggg/ApiTesting (方便的话给个星,不要白嫖呀,哈哈)。
  然后加载依赖:pip install -r requirements.txt   (或者使用Pycharm打开,会自动弹出提示安装)。
  2、使用Charles工具抓取接口数据包,并且导出选择JSON Session File (.chlsj) 格式 (工具自己百度下载吧)。
  3、新建一个项目MyTest目录和一个data目录,把抓取的接口数据包放置进来,然后修改runConfig.yml项目名为MyTest。
  4、直接开始运行,然后你就会发现项目目录多了很多文件,测试已经完成。。。没错,就是这么简单,你还可以查看allure报告。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号