首页 > 其他分享 >接口自动化之响应数据封装

接口自动化之响应数据封装

时间:2023-12-20 14:47:39浏览次数:34  
标签:__ .__ 封装 name show self 接口 key 自动化

在使用requests实现接口自动化时,接口响应的数据没有代码提示,要获取某个接口字段就需要通过[xxx]的方式来获取,实际开发过程中希望能通过.的方式来获取到某个接口响应属性。

方式一、使用dataclass

dataclass是python3.7新推出的特性之一

from dataclasses import dataclass 
@dataclass
class OrderVo:
    id: int 
    orderNo: str 
    ...
    status: str = 'CLOSED'  # 此处可以设置默认值,如果没有传值,则使用这个默认值

使用方式:

OrderVo(**response.json())

但是在实际使用过程中2个问题

  1. 接口增加字段后,初始化会报错,提示参数多了
  2. 后端介绍字段后,初始化又会报错,提示参数少了(此处虽然可以通过添加默认值来规避,但是频繁的修改的Vo的定义也会很麻烦)
  3. 如果对象是嵌套表示的,则每次都需要在__post_init__中定义嵌套对象要如何初始化

方式二、自定义响应对象

首先是元类的定义

import re
from types import GenericAlias


class ModelMetaclass(type):

    def __new__(cls, name, bases, attrs):
        if name == 'Model':
            return type.__new__(cls, name, bases, attrs)
        attrs['__default__'] = {}  # 此处用来保存数据的默认值
        __remove__ = []
        for key, value in attrs.items():
            if key.startswith('__'):  # 跳过双下划綫开头的属性
                continue
            attrs['__default__'][key] = value
            __remove__.append(key)
        for k in __remove__:
            attrs.pop(k)
        return type.__new__(cls, name, bases, attrs)

然后是定义基类

class Model(dict, metaclass=ModelMetaclass):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        for key, value in self.__annotations__.items():
            if key in self:
                if isinstance(value, ModelMetaclass):
                    self[key] = value(**self[key])
                elif isinstance(value, GenericAlias):
                    if self[key]:
                        self[key] = [value.__args__[0](**v) for v in self[key]]
                continue
            # 通过__default__拿到默认值,在初始化的时候将默认值赋值给属性,如果没有默认值且初始化的时候不传值就报错,则.get改为[]的方式来获取值即可
            self[key] = self.__default__.get(key, None)

    def __getattr__(self, item):
        try:
            return self[item]
        except KeyError:
            raise AttributeError(f"{self.__class__.__name__!r} object has no attribute {item!r}")

    def __getattribute__(self, item):
        return super().__getattribute__(item)

    def __setattr__(self, item, value):
        self[item] = value

    __show__ = None   # 定义数据的展示字段,如果为None,则展示全部的数据

    def __str__(self):
        show = self.__show__
        if not show:
            show = self.__annotations__.keys()
        if isinstance(show, str):
            show = re.split(r'[,\s]+', show.strip())  # 展示字段支持通过,和空格进行分割
        val = ', '.join(f"{key}={self.__getattr__(key)!r}" for key in show)
        return f'{self.__class__.__name__}({val})'

    __repr__ = __str__

最后是使用效果

# 定义两个对象
class Book(Model):
	name: str
	price: float = 3.4
	author: str = 'none'

	__show__ = 'name'

class Student(Model):
	name: str
	age: int = 3
	books: list[Book]

	__show__ = 'name'
	
print(Student())
# Student(name=None)
print(Student(name='zs'))
# Student(name='zs')
print(Student().books)
# None 
print(Student(**{'name': 'tom', 'age': 10, 'books': [{'name': 'sg', 'price': 1.2}]}).books)
# [Book(name='sg')]

标签:__,.__,封装,name,show,self,接口,key,自动化
From: https://www.cnblogs.com/jimiy009/p/17916466.html

相关文章

  • Jenkins自动化构建Vue项目的实践
    在现代的Web开发中,Vue.js已经成为一种非常流行的JavaScript框架。为了更高效地管理和部署Vue.js项目,使用自动化构建工具是至关重要的。Jenkins作为一款强大的持续集成和持续部署(CI/CD)工具,为我们提供了一种便捷的方式来自动化构建Vue.js项目。本文将介绍如何在Jenkins中配置和使用自......
  • 软件测试/人工智能|人工智能与测试开发自动化沙龙(PPT和回放集锦)
    12月09日下午,我们举办了人工智能与测试开发自动化沙龙。在这个不断演进的技术时代,人工智能已经深入到各行各业,并对测试领域带来了翻天覆地的变化。在本次沙龙上,我们聚焦于大语言模型、人工智能、领域模型、视觉自动化的实战应用等。通过分享案例和实用技巧,我们向大家展示了人工智......
  • 软件测试/测试开发|名企私教服务加盟全栈开发与自动化测试班,成就你的技术梦想
    随着ChatGPT的火爆以及人工智能的崛起,在互联网工作的我们仿佛都感受到了职业危机。一方面,人工智能技术的发展可能会取代某些工作,另一方面,人工智能技术的发展要求我们不断地学习和更新知识,以适应新的环境和需求。同时,我们也应该看到,人工智能技术的发展也带来了新的机遇,只要利用好......
  • (大模型训练)(工作流升级)(精品)MJ数据自动化处理流程!!!
     0.准备条件:文件夹为中文名,图片内含有多个下划线。  处理目标:处理成为一个  “公共标|逗号|一个句子"的形式。1.(统计中文,准备翻译)文件夹结构作为数据统计入excelimportosimportpandasaspddeffind_image_folders(parent_directory):"""遍历父目......
  • 使用Docker和Jenkin进行自动化测试、部署、回滚
    没有安装docker的可以通过dockerinstall进行安装。dockerjenkins运行jenkins首先创建一个目录存储容器中的信息mkdirjenkins-blue,然后执行命令sudochown-R1000:1000./jenkins-blue/,否则可能会报错touch:cannottouch‘/var/jenkins_home/copy_reference_file.log’:P......
  • API 接口设计最佳实践
    前言 最近团队内部在做故障复盘的时候发现有很多故障都是因为接口设计不当导致的,这里我就整理归纳一下在接口设计层面需要注意的地方。API接口设计Token设计 Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此To......
  • Python图像处理自动化:批量去除图片背景
    一、前言现在有较多的图片需要处理,需要将每张图片都去除背景。通常,我们使用像Photoshop这样的专业抠图软件或者在线抠图网页来处理,但这些方法通常只能一张一张地手动操作,效率低下。接下来将介绍使用Python批量处理,一键去除文件夹中所有图片的背景,从而大大提高工作效率。二、Python......
  • 给网站引入各大搜索引擎的关键字提示,白给的接口薅他羊毛。
    拥有一个关键词提示属于是导航网站必要的了因为网站是个导航网站,有一个搜索框,用户搜索时需要像百度一样有个搜索提示关键词列表。之前只是用百度,现在给增加了好几个,想换那个就换那个了,直接上图片可以配置属于是想选哪个选哪个,谁提示不爽就不用它,我可以用着bing的搜索引擎却使用......
  • 10.自动化测试定位策略
    App定位方式 定位策略描述AccessibilityID识别一个唯一的UI元素,对于XCUITest引擎,它对应的的属性名是 accessibility-id,对于Android系统的页面元素,对应的属性名是 content-descClassname对于iOS系统,它的class属性对应的属性值会以XCUIElementType开......
  • vue2前端调接口下载(导出)后端返回.zip压缩文件流
    1、接口api//三级教育档案导出exportfunctionsearchPersonnelHousInfoExport(data){returnrequest({url:train+'/fileExport/controller/export/personalProfile',method:'post',data:data,responseType:'blob',......