废话

目前在工作中写脚本的时候发现了一些之前开源的apiAutoTest的可优化项,后面应该也是会慢慢的继续优化了

2020/11/19

截止到写这篇文章的时间是,2020/11/19 00:53 现在也是把该项优化了,那优化了什么尼?

参数依赖

我理解的参数依赖/接口依赖就是接口进行关联操作,比如有些查询接口需要登录之后才可以操作,那么我们就需要拿到token之类的东西,这一部分东西是放到header中的,apiAutoTest围绕的只有路径参数依赖,请求数据依赖

  • 路径参数依赖

    譬如说现在的restful,一个users接口,路由一般这样的users他的请求方式是get,这个路由我们把他认为是查所有用户,如果查某一个用户可能是这样的users/:id也是个get请求,这里这个id想表达的意思是这里有个需要个用户id的参数,比如1-500里面的任意1个,也就是说这个id是可变的,可以从登录接口的返回响应取一个叫userId的值

  • 请求参数依赖

    这个应该好理解些,就是说支付接口需要的订单id,是从上一步提交订单接口返回的响应订单id

更新后的效果

由于在改动时发现了之前的代码挺绕的,而且都没什么帮助所以就不说了,如果对之前的感兴趣可以看这里:https://testerhome.com/topics/25003 , 下面上新版用例截图

  • 关于文件改动,新增了data_process.py文件里面封装了请求保存实际结果响应,path参数处理,请求数据处理

    1. #!/usr/bin/env/python3
    2. # -*- coding:utf-8 -*-
    3. """
    4. @project: apiAutoTest
    5. @author: zy7y
    6. @file: data_process.py
    7. @ide: PyCharm
    8. @time: 2020/11/18
    9. """
    10. import json
    11. import re
    12. from tools import *
    13. class DataProcess:
    14. response_dict = {}
    15. header = {}
    16. null_header = {}
    17. @classmethod
    18. def save_response(cls, key: str, value: object) -> None:
    19. """
    20. 保存实际响应
    21. :param key: 保存字典中的key,一般使用用例编号
    22. :param value: 保存字典中的value,使用json响应
    23. """
    24. cls.response_dict[key] = value
    25. logger.info(f'添加key: {key}, 对应value: {value}')
    26. @classmethod
    27. def handle_path(cls, path_str: str = '') -> str:
    28. """路径参数处理
    29. :param path_str: 带提取表达式的字符串 /&$.case_005.data.id&/state/&$.case_005.data.create_time&
    30. 上述内容表示,从响应字典中提取到case_005字典里data字典里id的值,假设是500,后面&$.case_005.data.create_time& 类似,最终提取结果
    31. return /511/state/1605711095
    32. """
    33. # /&$.case.data.id&/state/&$.case_005.data.create_time&
    34. path_str.split('/')
    35. for i in re.findall('&(.*?)&', path_str):
    36. path_str = path_str.replace(f'&{i}&', str(extractor(cls.response_dict, i)))
    37. logger.info(f'提取出的路径地址: {path_str}')
    38. return path_str
    39. @classmethod
    40. def handle_header(cls, is_token: str, response: dict, reg) -> dict:
    41. """处理header"""
    42. if is_token == '写':
    43. cls.header['Authorization'] = extractor(response, reg)
    44. return cls.header
    45. elif is_token == '':
    46. return cls.null_header
    47. else:
    48. return cls.header
    49. @classmethod
    50. def handle_data(cls, variable: str) -> dict:
    51. """请求数据处理
    52. :param variable: 请求数据,传入的是可转换字典/json的字符串,其中可以包含变量表达式
    53. return 处理之后的json/dict类型的字典数据
    54. """
    55. if variable == '':
    56. return
    57. for i in re.findall('&(.*?)&', variable):
    58. variable = variable.replace(f'&{i}&', str(extractor(cls.response_dict, i)))
    59. if 'null' in variable:
    60. variable = variable.replace('null', 'None')
    61. if 'true' in variable:
    62. variable = variable.replace('true', 'True')
    63. if 'false' in variable:
    64. variable = variable.replace('false', 'False')
    65. logger.info(f'最终的请求数据如下: {variable}')
    66. return eval(variable)

    相比之前这种写法应该更加清晰,然后之前的请求数据是采用字典合并的方式,在请求数据多层结构的时候会出现bug,现在改成了文本替换之后转json/dict的方法

新版依赖数据如何使用

举个例子

假设现在有个实际响应结果字典如下

  1. {"case_002": {
  2. "data": {
  3. "id": 500,
  4. "username": "admin",
  5. "mobile": "12345678",
  6. }},
  7. "case_005": {
  8. "data": {
  9. "id": 511,
  10. "create_time": 1605711095
  11. },
  12. }
  13. }
  • excel中接口路径内容:users/&$.case_005.data.id&/state/&$.case_005.data.careate_time&

    代码内部解析后如下:users/511/state/1605711095

    &$.case_005.data.id& 代表从响应字典中提取case_005字典中data字典中的id的值,提取出来的结果是511

  • excel中请求参数内容如下:

    1. {
    2. "pagenum": 1,
    3. "pagesize": "12",
    4. "data": &$.case_005.data&,
    5. "userId": &$.case_002.data.id&
    6. }

    代码内部解析后如下:

    1. {
    2. "pagenum": 1,
    3. "pagesize": "12",
    4. "meta": {
    5. "id": 511,
    6. "create_time": 1605711095
    7. },
    8. "userId": 500
    9. }

其实不难看出其中规则&jsonpath提取语法&,如果你需要的内容是字符串类型,只需要这样"&jsonpath提取语法&"

源码地址

github: https://github.com/zy7y/apiAutoTest.git

gitee: https://gitee.com/zy7y/apiAutoTest.git

道谢

谢谢各位的点评,在实际工作写到之后发现之前的写法的确不如意,希望多写,然后进步~晚安

接口自动化测试:apiAutoTest使用re 处理数据依赖的更多相关文章

  1. 接口自动化测试框架 (一) :APIAutoTest框架

    前言 随着测试技术的发展,接口自动化测试逐渐成为各大公司投入产出比最高的测试技术.介入时间早,执行效率高,稳定性高的优点,让越来越多的公司引入接口自动化测试. 框架简介 APIAutoTest是处理A ...

  2. 接口自动化测试框架 :APIAutoTest框架

    前言 随着测试技术的发展,接口自动化测试逐渐成为各大公司投入产出比最高的测试技术.介入时间早,执行效率高,稳定性高的优点,让越来越多的公司引入接口自动化测试. 框架简介 APIAutoTest是处理A ...

  3. Python接口自动化测试框架: pytest+allure+jsonpath+requests+excel实现的接口自动化测试框架(学习成果)

    废话 最近在自己学习接口自动化测试,这里也算是完成一个小的成果,欢迎大家交流指出不合适的地方,源码在文末 问题 整体代码结构优化未实现,导致最终测试时间变长,其他工具单接口测试只需要39ms,该框架中 ...

  4. python - 接口自动化测试 - RunTest - 测试用例加载执行/测试报告生成

    # -*- coding:utf-8 -*- ''' @project: ApiAutoTest @author: Jimmy @file: run_test.py @ide: PyCharm Com ...

  5. Python接口自动化测试框架实战 从设计到开发

    第1章 课程介绍(不要错过)本章主要讲解课程的详细安排.课程学习要求.课程面向用户等,让大家很直观的对课程有整体认知! 第2章 接口测试工具Fiddler的运用本章重点讲解如何抓app\web的htt ...

  6. seldom 2.0 让接口自动化测试更简单

    前言 HTTP接口测试很简单,不管工具.框架.还是平台,只要很的好的几个点就是好工具. 测试数据问题:比如删除接口,重复执行还能保持结果一致,必定要做数据初始化. 接口依赖问题:B接口依赖A的返回值, ...

  7. 接口自动化测试的"开胃小菜"---简单黑客攻击手段

    Web应用系统的小安全漏洞及相应的攻击方式 接口自动化测试的"开胃小菜" 1   写作目的 本文讲述一个简单的利用WebAPI来进行一次基本没有破坏力的“黑客”行为. 主要目的如下 ...

  8. APP接口自动化测试JAVA+TestNG(三)之HTTP接口测试实例

    前言     前两篇普及相关基础知识后,本篇主要对举例对国家气象局接口自动化测试进行讲解(Get请求及结果断言),以达到自动化测试入门目的,除了前两篇的一些了解外,需要有一定的JAVA知识(HTTP相 ...

  9. APP接口自动化测试JAVA+TestNG(二)之TestNG简介与基础实例

    前言 继上篇环境篇后,本篇主要对TestNG进行介绍,给出最最基础的两个实例,通过本文后,学会并掌握TestNG测试用例的编写与运行,以及生成美化后的报告.下一篇为HTTP接口实战(国家气象局接口自动 ...

  10. 手把手教你接口自动化测试 – SoapUI & Groovy

    手把手教你接口自动化测试 – SoapUI & Groovy http://www.cnblogs.com/wade-xu/p/4236295.html 关键词:SoapUI接口测试,接口自动 ...

随机推荐

  1. CentOS 7的安装与部署 01

    01 虚拟软件的安装与配置 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统.在实体计算机中能够完成的工作在虚拟机中都能够实现. ...

  2. net core 微服务 快速开发框架

    dymDemo github 地址:https://github.com/duyanming/dymDemo dym 分布式开发框架 Demo 熔断 限流 事件总线(包括基于内存的.rabbitmq的 ...

  3. 【原创】有利于提高xenomai 实时性的一些配置建议

    版权声明:本文为本文为博主原创文章,转载请注明出处.如有错误,欢迎指正. @ 目录 一.影响因素 1.硬件 2.BISO(X86平台) 3.软件 4. 缓存使用策略与GPU 二.优化措施 1. BIO ...

  4. VitualBox CentOS增强功能的安装使用 - Linux操作系统

        本人因为电脑配置原因,安装的是CentOS 6.6 minimal版本,虚拟环境为VirtualBox 4.3.18. 当我使用的时候,想从本机(WindowXP)电脑将文件共享到虚拟(Cen ...

  5. spring boot:用swagger3生成接口文档,支持全局通用参数(swagger 3.0.0 / spring boot 2.3.2)

    一,什么是swagger? 1,  Swagger 是一个规范和完整的文档框架, 用于生成.描述.调用和可视化 RESTful 风格的 Web 服务文档 官方网站: https://swagger.i ...

  6. Go go.mod入门

    什么是go.mod? Go.mod是Golang1.11版本新引入的官方包管理工具用于解决之前没有地方记录依赖包具体版本的问题,方便依赖包的管理. Go.mod其实就是一个Modules,关于Modu ...

  7. Cypress系列(67)- 环境变量设置指南

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 常见的环境变量设置方式 可参考这篇文章: ...

  8. PyTorch常用参数初始化方法详解

    1. 均匀分布 torch.nn.init.uniform_(tensor, a=0, b=1) 从均匀分布U(a, b)中采样,初始化张量. 参数: tensor - 需要填充的张量 a - 均匀分 ...

  9. RocketMQ扫盲篇

    本篇博客主要参考: <浅入浅出>-RocketMQ 敖丙 APACHE-RocketMQ Gitee RocketMQ官方文档 RocketMQ 实战与进阶 GitChat 又是好久没有写 ...

  10. Hugo+Github 搭建个人博客(Windows环境下)

    目录 Hugo+Github 搭建个人博客(Windows环境下) 1.前言 2.Differences 2.1 https vs SSH 2.2 新建的github的仓库名必须为 用户名+githu ...