如何在pytest接口自动化框架中扩展JSON数据解析功能?

这篇具有很好参考价值的文章主要介绍了如何在pytest接口自动化框架中扩展JSON数据解析功能?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开篇

上期内容简单说到了。params类类型参数的解析方法。相较于简单。本期内容就json格式的数据解析,来进行阐述。

在MeterSphere中,有两种方式可以进行json格式的数据维护。一种是使用他们自带的JsonSchema来填写key-value表单。另一种就是手写json。

手写json在日常工作中效率较低,原因有二,一是手写太麻烦,占据大量个工作时间,影响效率。二是对正确性以及层级结构无法保证准确性。两者相比较,故选择JsonSchema的方式来维护json格式的数据。

json格式数据模型如下

"jsonSchema": {
      "properties": {
        "字段1": {
          "mock": {
            "mock": ""
          },
          "type": "string",
          "description": "字段描述。。。"
        },
        "字段2": {
          "type": "number",
          "mock": {
            "mock": ""
          },
          "minLength":50,
          "maxLength":100
        },
        "字段3": {
          "type": "integer",
          "mock": {
            "mock": ""
          },
          "description": "字段描述"
        }
      },
      "type": "object",
      "mock": {
        "mock": ""
      },
      "required": [
        "字段1",
        "字段2",
      ]
    }

使用JsonSchema作为最外层节点,第二层节点包含了类型、字段属性、必填字段列表等参数信息。第三层节点就是字段的一些属性,包含了字段长度、字段名称、字段类型、字段描述等

特别需要说明的是,MeterSphere的字段类型有很多,其中包含了object以及array这两种类型的数据

  • object:如果字段类型是object,那么该字段节点下会嵌套另外一些字段,这些字段也是json格式的
  • array:同理,如果字段类型是array,那么该字段下面会嵌套一个列表,列表中的每一个元素,都是json格式,不可以手动设置key,是从0递增自动命名。

这两种类型是可以无限重复套娃下去。只要你需要。

所以在解析这类数据时,我们就需要先解决这种层层嵌套的问题。

思路梳理

  • 首先判断一下数据类型是否为上述这种套娃格式
    • 判断字段类型是object还是array
    • 利用python的递归,调用自身。并将字段属性作为参数传给这个函数
  • 然后提取字段中的最大值,最小值,以及参数名称、类型
  • 判断当前字段是否在必填列表中,如果在,则将这个字段设置为必填

如上是大概的解题思路,抛开拆解套娃,代码相对简单。如下是源码展示

# 解析json请求的参数
def post_arguments(data, required_list=None):
    field = {}
    if not isinstance(data, dict):
        raise TypeError("'data' is not dict")
    for key, value in data.items():
        if value["type"] == "object" and "properties" in value:
            # 递归调用,实现多层嵌套解析
            if "required" in value:
                recursion_par = post_arguments(value["properties"], value["required"])
                par = {
                    key:
                        {"type": value["type"],
                         "description": value["description"] if "description" in value else "",
                         **recursion_par
                         }
                }
                field.update(par)
            else:
                recursion_par = post_arguments(value["properties"])
                par = {
                    key: {"type": value["type"],
                          "description": value["description"] if "description" in value else "",
                          **recursion_par
                          }
                }
                field.update(par)
        elif value["type"] == "array" and "items" in value:
            for l, i in enumerate(value["items"]):
                for arr_key, arr_value in i.items():
                    if arr_value == "object" and "properties" in arr_value:
                        # 递归调用,实现多层嵌套解析
                        if "required" in arr_value:
                            recursion_par = post_arguments(arr_value["properties"], value["required"])
                            par = {
                                l: {"type": value["type"],
                                    "description": value["description"] if "description" in value else "",
                                    **recursion_par

                                    }
                            }
                            field.update(par)
                        else:
                            recursion_par = post_arguments(arr_value["properties"])
                            par = {
                                l: {"type": value["type"],
                                    "description": value["description"] if "description" in value else "",
                                    **recursion_par
                                    }
                            }
                            field.update(par)
                    elif arr_value == "array" and "items" in arr_value:
                        if "required" in arr_value:
                            recursion_par = post_arguments(arr_value["properties"], arr_value["required"])
                            par = {
                                l: {"type": value["type"],
                                    "description": value["description"] if "description" in value else "",
                                    **recursion_par
                                    }
                            }
                            field.update(par)
                        else:
                            recursion_par = post_arguments(arr_value["properties"])
                            par = {
                                l: {"type": value["type"],
                                    "description": value["description"] if "description" in value else "",
                                    **recursion_par
                                    }
                            }
                            field.update(par)
                    else:
                        maxLength = MAX_LENGTH
                        minLength = MIN_LENGTH
                        required = "false"
                        if "maxLength" in arr_key:
                            maxLength = i["maxLength"]
                        elif "maxLength" in arr_key:
                            minLength = i["minLength"]
                        if required_list:
                            if l in required_list:
                                required = "true"
                        items_par = {
                            key:
                                {
                                    "type": value["type"],
                                    "description": value["description"] if "description" in value else "",
                                    l: {
                                        "type": i["type"],
                                        "required": required,
                                        "max": maxLength,
                                        "min": minLength
                                    }
                                }
                        }
                        field.update(items_par)
        else:
            maxLength = MAX_LENGTH
            minLength = MIN_LENGTH
            required = "false"
            if "maxLength" in value:
                maxLength = value["maxLength"]
            elif "minLength" in value:
                minLength = value["minLength"]
            if required_list:
                if key in required_list:
                    required = "true"
                else:
                    required = "false"
            par = {
                key: {
                    "type": value["type"],
                    "description": value["description"] if "description" in value else "",
                    "required": required,
                    "max": maxLength,
                    "min": minLength,
                }
            }
            field.update(par)
    return field

可以看到,思路不是很难,但是代码还是比较臃肿的,其中有很多的代码是冗余的,在后期优化中,将考虑这块重构一下。大家在写的时候将思路缕清,别写出我这么烂的代码。。。。引以为戒~

结语

总结一下这个函数

  • 首先在写的时候,多重嵌套是个难题,可以通过递归的方式解决
  • 另外一定在思路缕清的前提下,再开始写代码,我就是在边写边思考,一个for循环一个for循环的嵌套。导致代码极其臃肿。执行效率有一定程度的降低,且代码可读性不好
  • 公共代码提取:像一些数据结构模板,这些都可以提取成一个公共变量,然后调用即可。在函数中反复写着相类似的模板,是一种很愚蠢的行为。。。

正在做测试的朋友可以进来交流,群里给大家整理了大量学习资料和面试题项目简历等等....文章来源地址https://www.toymoban.com/news/detail-500108.html

到了这里,关于如何在pytest接口自动化框架中扩展JSON数据解析功能?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 接口自动化测试实战之pytest框架+allure讲解

    本文章主要会讲解Python中pytest框架的讲解,介绍什么是pytest、为何要测试、为何使用以及参考和扩展等等,话不多说,咱们直接进入主题哟。 pytest是一款单元测试框架,在编程过程中,单元主要指的是代码中最小的组成部分,例如函数或类,在面向对象中,最小的单元就是类

    2024年02月05日
    浏览(87)
  • 接口自动化测试框架(pytest+allure+aiohttp+ 用例自动生成)

    近期准备优先做接口测试的覆盖,为此需要开发一个测试框架,经过思考,这次依然想做点儿不一样的东西。 接口测试是比较讲究效率的,测试人员会希望很快能得到结果反馈,然而接口的数量一般都很多,而且会越来越多,所以提高执行效率很有必要 接口测试的用例其实

    2024年02月07日
    浏览(61)
  • 基于Pytest+Allure+Excel的接口自动化测试框架

    Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具,它不仅以 Web 的方式展示了简介的测试结果,而且允许参与开发过程的每个人可以从日常执行的测试中,最大限度地提取有用信息。 Allure 是由 Java 语言开发的,支持 Pytest,JaveScript、PHP、Ruby 等。 从 DEV/QA 的角

    2024年02月09日
    浏览(73)
  • 接口自动化测试框架开发 (pytest+allure+aiohttp+ 用例自动生成)

    目录 前言: 第一部分(整个过程都要求是异步非阻塞的) 读取 yaml 测试用例 http 请求测试接口 收集测试数据 第二部分 动态生成 pytest 认可的测试用例 后续(yml 测试文件自动生成) 前言: 开发一个接口自动化测试框架是一个很好的方式,可以提高测试效率和准确性。在这

    2024年02月16日
    浏览(61)
  • 接口自动化测试框架开发(pytest+allure+aiohttp+ 用例自动生成)

    近期准备优先做接口测试的覆盖,为此需要开发一个测试框架,经过思考,这次依然想做点儿不一样的东西。 接口测试是比较讲究效率的,测试人员会希望很快能得到结果反馈,然而接口的数量一般都很多,而且会越来越多,所以提高执行效率很有必要 接口测试的用例其实

    2024年01月23日
    浏览(55)
  • 接口自动化框架之python pytest-mark(三)

    在测试用例/测试类前面加上: @pytest.mark.标签名, 打标记范围:测试用例、测试类、模块文件 在使用mark标签之前要创建pytest.ini配置文件,同样在运行的时候,‘-m’参数后边也要标识分类标签的名称 1.创建测试代码 2.配置文件:(注意:一定是pytest.ini) 3.执行: 完整代码

    2024年02月07日
    浏览(44)
  • 一个简单的接口自动化测试框架:Python+Requests+Pytest+Allure

    project:api_test ——api_keyword ————api_key.py:接口驱动类 ——case ————test_cases.py:测试套件和测试用例 ——report_allure( 无需创建 ):allure报告 ——result( 无需创建 ):测试用例运行结果 ——VAR ————VAR.py:常量类 conftest.py:项目级别fixture main.py:主函数

    2024年02月03日
    浏览(72)
  • Python+Pytest+Allure+Git+Jenkins数据驱动接口自动化测试框架

    一、接口基础 接口测试是对系统和组件之间的接口进行测试,主要是效验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。其中接口协议分为HTTP,RPC,Webservice,Dubbo,RESTful等类型。 接口测试流程 1、需求评审,熟悉业务和需求 2、开发提供接口文档 3、编写接口测

    2024年02月08日
    浏览(82)
  • (Python)Requests+Pytest+Allure接口自动化测试框架从0到1搭建

    前面,已经学习了如何用SpringBoot写接口以及与Mysql数据库进行交互,具体可查阅下面的这篇博客,今天学习一下基于Python的接口自动化测试框架的搭建,主要包括以下内容:利用request库发送请求,请求数据参数化处理,还涉及到数据库(Mysql+MongDB)方面的交互,包括如何取数

    2024年02月13日
    浏览(161)
  • 从0到1框架搭建,Python+Pytest+Allure+Git+Jenkins接口自动化框架(超细整理)

    接口测试是对系统和组件之间的接口进行测试,主要是效验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。其中接口协议分为HTTP,RPC,Webservice,Dubbo,RESTful等类型。 接口测试流程 1、需求评审,熟悉业务和需求 2、开发提供接口文档 3、编写接口测试用例 4、用

    2024年02月14日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包