当前位置: 首页 > news >正文

pytest+request+yaml+allure搭建低编码调试门槛的接口自动化框架

接口自动化非常简单,大致分为以下几步:

  1. 准备入参
  2. 调用接口
  3. 拿到2中response,继续组装入参,调用下一个接口
  4. 重复步骤3
  5. 校验结果是否符合预期

一个优秀接口自动化框架的特点:

  1. 【编码门槛低】,又【能让新手学到技术】
  2. 【低调试门槛】
  3. 【优秀的可读性】
  4. 【很好的可维护性】
  5. 能很【方便多人协同】,以便【自动化代码能不断积累】形成规模效应,且【自动化case覆盖率可量化】
  6. 有失败重试机制,克服环境的不稳定
  7. 【清晰的测试报告】
  8. 能【低成本且灵活地触发】(指定环境、指定时间、指定范围)

综上,我们需要搭建一个同时满足以上特点的轻量级接口自动化框架

首先,管理接口

    达成:【编码门槛低】【方便多人协同】【优秀的可读性】【很好的可维护性】

  • 被测接口单独管理,目录结构和和开发使用的yapi保持一致,统一放置在仓库下,“接口管理”目录中;如下:

        

  • 每个接口使用yaml文件管理,如下,且使用中文命名增加可读性。
  • method: post
    host: "${host}"
    url: /copy/trading/v1/follower/edit
    headers:{token: "799b72f3f94973f5a54a54204eac96a1aa94cd5d365245929098e921b2ddc154"}
    body:{"followType": 1,"traderUid": 102806,"margin": "100","followAmount": "1000","stopLossRation": null,"positionMode": 1,"positionModeConfig": 0,"leverModeConfig": 0,"leverage": 1,"marginModeConfig": 0,"marginMode": 0,"positionRisk": null,"slippage": "0.006",}
    response:code: # 响应码(0: 成功)msg: #  返回描述(code为0时,返回:成功)data: # 响应数据
  • 调用接口时,默认用yaml文件中的参数(剔除response,response只做示例用),如需替换,会在调用过程中,标记具体需要替换的key value即可,如下,方便快捷
  • r.invoke_api("更新用户配置.yaml", headers={"token": 'trader_son_token'}, body={"positionMode": 1})

其次,编写代码,调用接口

        达成:【编码门槛低】【优秀的可读性】【低调试门槛】【清晰的测试报告】

  • 封装requests包,使用requests.session(),根据上述接口文档,调用get或post方法,且使用allure将入参和返回都放置到测试报告里面,且此块代码无需实际接口测试同学关注。【能让新手学到技术】
  • class RequestUtil:def invoke_api(self, api, headers=None, body=None):"""解析需要调用的接口,并且进行参数替换,基础断言等:param api: 需要调用的接口:param header: 需要传入的请求头:param body: 需要传入的请求体:return: 返回接口响应的结果"""api_name = apiparam = YamlUtil.parse_api(api_name)if headers is not None:for key in headers:param['headers'][key] = headers[key]if body is not None:for key in body:param['body'][key] = body[key]params = self.replace_value(param)with allure.step(f"步骤:{api_name}"):response = self.send_request(params)if self.run_mode == 1:print("")print(f"调用接口:{api_name}")print(params)print(response)return responseelse:return responsedef send_request(self, *args):"""发起接口请求:param args: 接口请求的参数:return: 接口返回的数据"""method = args[0]['method'].lower()ip = self.replace_value(args[0]['host'])url = ip + args[0]['url']headers = args[0]['headers']body = args[0]['body']data = bodyif method == "get":res = self.sess.get(url, params=data, headers=headers)elif method == "post":if 'files' in args:files = args[0]['files']file_path = os.path.join(YamlUtil.data_file_path, files)with open(file_path, 'rb') as file:files = {'file': ('image.jpg', file)}res = self.sess.post(url, files=files, headers=headers)res = self.sess.post(url, json=data, headers=headers)else:print("请求方式错误")try:res = res.json()with allure.step(f"URL:{url}"):...with allure.step(f"Method:{method}"):...with allure.step(f"Headers:{json.dumps(headers)}"):...with allure.step(f"Body:{json.dumps(data, ensure_ascii=False)}"):...with allure.step(f"Response:{json.dumps(res, ensure_ascii=False)}"):return resexcept Exception as e:print("该接口返回的结果不是json数据?")res = res.textwith allure.step(f"URL:{url}"):...with allure.step(f"Method:{method}"):...with allure.step(f"Headers:{json.dumps(headers)}"):...with allure.step(f"Body:{json.dumps(data, ensure_ascii=False)}"):...with allure.step(f"Response:{json.dumps(res, ensure_ascii=False)}"):return res
  • 通过pytest的fixture装饰器,将RequestUtil注入进去每个测试用例里面去
  • @pytest.fixture(scope="session")
    def r():return RequestUtil()
    

  • 测试编码同学只需要使用方法,即可完成接口调用和response获取
  • 接口:百度.yaml
  • method: post
    host: https://ug.baidu.com
    url: /mcp/pc/pcsearch
    headers:{}
    body:{"errno": 0,"errmsg": "ok","data": {"log_id": "1652589279","action_rule": {"pos_1": [],"pos_2": [],"pos_3": []}}}

    事实上,测试代码只有这么点:【编码门槛低】只需要能看懂接口文档,和http的基本知识,以及知道Python的字典和assert,便可轻松完成编码

    def test_百度(r):#其中 r为fixture装饰器,通过conftest.py注入进去resdic= r.invoke_api("百度.yaml",headers={},body={})assert resdic[errmsg] == "ok"
    assert resdic[data][log_id] == "3277317105"
  • 不管成功失败,测试报告都会打出每一次请求的入参和返回,如下图,都不用在IDE里面调试。【低调试门槛】【清晰的测试报告】
  • 另外,数据驱动的case,用如下的方式编写
  • import pytest@pytest.mark.parametrize('emails,password,assert1', [('11111@qq.com', 'Tset111', 'success'),('22222@qq.com', 'Tset222', 'fail'),('33333@qq.com', 'Tset333', 'error'),
    ])
    def test_注册用户(r, emails, password, assert1):response_info = r.invoke_api('注册用户.yaml', body={"emails": emails, "password": password})assert response_info['data'] == assert1
    

再次,测试用例的组织和结构

        达成:【方便多人协同】【自动化代码能不断积累】【自动化case覆盖率可量化】

  1. 手工用例遵循实际的业务模块树形结构,做较精细的模块拆分
  2. 末级手工用例使用xmind管理,作为用例树的末级,标题上按如下打标:哪些场景需要被覆盖(目标)?已被覆盖(进度)?功能覆盖率多少(量化)?哪些地方还需要验证前端?一目了然,工时评估更透明
    • 是否需要自动化
    • 是否已被自动化
    • 是否还需要验证前端
  3. 自动化测试用例目录,和手工用例目录保持一致,
  4. 每个自动化case一个.py文件,自动化测试用例名与手工测试名保持一致。如此保障一一对应
  5. 如若涉及一对多:
    1. 如果涉及单接口的,自动化测试用例名与手工用例末级目录一致;
    2. 如果涉及数据驱动的,自动化测试用例名与手工用例末级目录一致;
  6. 通过以上措施,很方便计算出自动化case覆盖率(分子为已完成自动化case,分母为达标为:需要自动化的case数)

再次,通过配置文件,和参数化运行

        达成【低成本且灵活地触发】

  • yaml方式的配置文件
  • run_mode: 2 # 1调试模式/2正式模式
    run_env: one  # 运行脚本环境test:host: http://api.test.xyzdb:host:port:user:password:redis:host:password:testa:host: http://api.testa.xyzdb:host:port:user:password:redis:host:password:# 环境
    one:# 接口地址host: # b连接信息db:host:port:user:password:# redis连接信息redis:host:password:
  • main函数运行的时候,拿到具体运行的环境信息,读取对应的配置
  • import os
    import pytest
    from pytest_jsonreport.plugin import JSONReport
    import argparsefrom Core.parse_yaml import YamlUtil
    from Core.robot_utils import Robotdef main(env):YamlUtil.clear_env_yaml()if env.env is not None:e = env.envdata = {"env": e}YamlUtil.write_env_yaml(data)current_path = os.path.dirname(os.path.abspath(__file__))json_report_path = os.path.join(current_path, 'report/json')html_report_path = os.path.join(current_path, 'report/html')plugin = JSONReport()pytest.main(["自动化用例/百度搜索.py", '--alluredir=%s' % json_report_path, '--clean-alluredir'], plugins=[plugin])# 生成allure报告os.system('allure generate %s -o %s --clean' % (json_report_path, html_report_path))os.system('allure open %s' % html_report_path)if __name__ == "__main__":parser = argparse.ArgumentParser()parser.add_argument("--env", help="参数为需要执行的环境")args = parser.parse_args()main(args)
  • #在testa环境运行
    python run.py --env testa

相关文章:

pytest+request+yaml+allure搭建低编码调试门槛的接口自动化框架

接口自动化非常简单,大致分为以下几步: 准备入参调用接口拿到2中response,继续组装入参,调用下一个接口重复步骤3校验结果是否符合预期 一个优秀接口自动化框架的特点: 【编码门槛低】,又【能让新手学到…...

Elasticsearch实战指南:从入门到高效使用

Elasticsearch实战指南:从入门到高效使用 1. 引言:Elasticsearch是什么? Elasticsearch是一个分布式、RESTful风格的搜索和分析引擎,广泛应用于全文搜索、日志分析、实时数据分析等场景。它的核心特点包括: 高性能&…...

Open FPV VTX开源之嵌入式OSD配置

Open FPV VTX开源之嵌入式OSD配置 1. 源由2. 安装3. 配置步骤一:备份/etc/telemetry.conf步骤二:修改/etc/telemetry.conf步骤三:配置时区步骤四:重启摄像头 4. 实测5. 参考资料 1. 源由 穿越机模拟图传延迟通常在10ms左右。 最…...

2Hive表类型

2Hive表类型 1 Hive 数据类型2 Hive 内部表3 Hive 外部表4 Hive 分区表5 Hive 分桶表6 Hive 视图 1 Hive 数据类型 Hive的基本数据类型有:TINYINT,SAMLLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE&a…...

计算机网络之---公钥基础设施(PKI)

公钥基础设施 公钥基础设施(PKI,Public Key Infrastructure) 是一种用于管理公钥加密的系统架构,它通过结合硬件、软件、策略和标准来确保数字通信的安全性。PKI 提供了必要的框架,用于管理密钥对(包括公钥…...

EF Core执行原生SQL语句

目录 EFCore执行非查询原生SQL语句 为什么要写原生SQL语句 执行非查询SQL语句 有SQL注入漏洞 ExecuteSqlInterpolatedAsync 其他方法 执行实体相关查询原生SQL语句 FromSqlInterpolated 局限性 执行任意原生SQL查询语句 什么时候用ADO.NET 执行任意SQL Dapper 总…...

GaussDB分布式数据倾斜处理

常规数据倾斜巡检 在库中表个数少于1W的场景,直接使用倾斜视图查询当前库内所有表的数据倾斜情况 SELECT * FROM pgxc_get_table_skewness ORDER BY totalsize DESC;在库中表个数非常多(至少大于1W)的场景,因PGXC_GET_TABLE_SKEWN…...

代码随想录Day34 | 62.不同路径,63.不同路径II,343.整数拆分,96.不同的二叉搜索树

代码随想录Day34 | 62.不同路径,63.不同路径II,343.整数拆分,96.不同的二叉搜索树 62.不同路径 动态规划第二集: 比较标准简单的一道动态规划,状态转移方程容易想到 难点在于空间复杂度的优化,详见代码 class Solution {public int uniq…...

vue.js辅助函数-mapMutations

在Vue.js中,使用辅助函数可以更方便地使用Vuex的mutation。而mapMutations就是Vuex提供的一个辅助函数,它可以将mutation映射到组件的methods中,使得我们可以在组件中直接调用mutation,而不需要手动进行commit。 mapMutations函数…...

Vue3组件设计模式:高可复用性组件开发实战

Vue3组件设计模式:高可复用性组件开发实战 一、前言 在Vue3中,组件设计和开发是非常重要的,它直接影响到应用的可维护性和可复用性。本文将介绍如何利用Vue3组件设计模式来开发高可复用性的组件,让你的组件更加灵活和易于维护。 二、单一职责…...

PHP 8.4 安装和升级指南

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...

什么是 OpenResty

1、OpenResty简介 1.1 了解OpenResty OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。 简单地说OpenRes…...

Windows图形界面(GUI)-QT-C/C++ - QT控件创建管理初始化

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 控件创建 包含对应控件类型头文件 实例化控件类对象 控件设置 设置父控件 设置窗口标题 设置控件大小 设置控件坐标 设置文本颜色和背景颜色 控件排版 垂直布局 QVBoxLayout …...

【计算机网络】lab8 DNS协议

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀计算机网络_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…...

了解linux中的“of_property_read_u32()”

of_property_read_u32(node, "post-pwm-on-delay-ms",&data->post_pwm_on_delay); /*根据"post-pwm-on-delay-ms",从属性中查找并读取一个32位整数*/ /*读到一个32位整数,保存到data->post_pwm_on_delay中*/ of_property_read_u32…...

iOS - Objective-C 底层中的内存屏障

1. 基本实现 // objc-os.h 中的内存屏障实现 #define OSMemoryBarrier() __sync_synchronize()// ARM 架构特殊处理 static ALWAYS_INLINE void OSMemoryBarrierBeforeUnlock() { #if defined(__arm__) || defined(__arm64__)OSMemoryBarrier(); #endif } 2. 解锁前的内存屏…...

阿里云服务器扩容系统盘后宝塔面板不显示扩容后的大小

解决方法步骤: 1. yum install cloud-utils-growpart xfsprogs -y 2.growpart /dev/vda 3 扩容系统盘的第3个分区 主要是这个命令1 3. fdisk -l 4. df -h 5. xfs_growfs /dev/vda3 主要是这个命令2 主要使用 df -Th 这个命令查看对应的文件系统类型 (1)、ext…...

c语言——【linux】多进程编程 【进程的创建,相关shell指令,进程状态切换,回收资源,守护进程等】

1.思维导图 2.进程的创建 函数原型:pid_t fork(void); 功能描述:以当前进程为父进程,创建一个子进程 进程链和进程扇的创建 3.多进程具体使用 3.1进程替换 exec 函数一族 int execl(const char *path, const char *arg, ... /* (char *) N…...

macos 搭建 ragflow 开发环境

ragflow 是一个很方便的本地 RAG 库。本文主要记录一下在本机的部署过程 1、总体架构说明 开发环境:macbook pro(m1),16G内存 512G固态 因本机的内存和硬盘比较可怜,所以在服务器上部署基础 docker 包,…...

信创改造-龙蜥操作系统搭载MySql、Tomcat等服务

龙蜥操作系统 Anolis OS 8 是 OpenAnolis 社区推出的完全开源、中立、开放的发行版,它支持多计算架构,也面向云端场景优化,兼容 CentOS 软件生态。Anolis OS 8 旨在为广大开发者和运维人员提供稳定、高性能、安全、可靠、开源的操作系统服务。…...

【华为战报】4月、5月 HCIP考试战报!

了解更多往期考试→点 【考试战报】 华为认证 HCIP 4、5月微思 | HCIP 考试战报 学员成绩单 华为认证 最新开班 厦门面授 全国直播 新生代网工必看:华为模拟器eNSP安装教程(附下载链接)...

数字化转型全场景安全解析:从产品到管理的防线构建与实施要点

在数字化转型中,安全已从“可选配置” 升级为 “必需底座”,贯穿于产品生命周期、生产过程、供应链及管理决策全场景。以下从南京市场景清单出发,结合技术实践与政策要求,分析安全在各核心场景中的具体内涵与实施要点:…...

DeepSeek 赋能自动驾驶仿真测试:解锁高效精准新范式

目录 一、自动驾驶仿真测试概述1.1 自动驾驶发展现状1.2 自动驾驶仿真测试流程 二、DeepSeek 技术剖析2.1 DeepSeek 简介2.2 DeepSeek 核心技术原理 三、DeepSeek 在自动驾驶仿真测试中的应用原理3.1 与自动驾驶仿真测试流程的结合点3.2 如何提升仿真测试效果 四、DeepSeek 在自…...

ps自然饱和度调整

在Photoshop(PS)中,自然饱和度调整是一项用于优化图像色彩的重要功能,以下是对其详细解析: 一、功能概述 自然饱和度主要针对画面中饱和度较低的像素进行着重调整,同时对高饱和度区域限制较小&#xff0c…...

从线性方程组角度理解公式 s=n−r(3E−A)

从线性方程组角度理解公式 sn−r(3E−A) 这个公式本质上是 ​齐次线性方程组解空间维度 的直接体现。下面通过三个关键步骤解释其在线性方程组中的含义: 1. ​公式对应的线性方程组 考虑矩阵方程: (3E−A)x0 其中: x 是 n 维未知向量3E−…...

内存管理--《Hello C++ Wrold!》(8)--(C/C++)--深入剖析new和delete的使用和底层实现

文章目录 前言C/C内存分布new和deletenew和delete的底层定位new表达式 内存泄漏作业部分 前言 在C/C编程中,内存管理是理解程序运行机制的核心基础,也是开发高效、稳定程序的关键。无论是局部变量的存储、动态内存的分配,还是对象生命周期的…...

命令行式本地与服务器互传文件

文章目录 1. 背景2. 传输方式2.1 SCP 协议传输2.2 SFTP 协议传输 3. 注意 命令行式本地与服务器互传文件 1. 背景 多设备协同工作中,因操作系统的不同,我们经常需要将另外一个系统中的文件传输到本地PC进行浏览、编译。多设备文件互传,在嵌入…...

WordPress通过简码插入bilibili视频

发布于:Eucalyptus-Blog 一、前言 B站是国内非常受欢迎的视频分享平台,上面不仅内容丰富,而且很多视频制作精良、趣味十足。很多人,比如我,就喜欢将B站的视频通过 iframe 嵌入到自己的网页中,但这段代码又…...

中科院报道铁电液晶:从实验室突破到多场景应用展望

2020年的时候,相信很多关注科技前沿的朋友都注意到,中国科学院一篇报道聚焦一项有望改写显示产业格局的新技术 —— 铁电液晶(FeLC)。这项被业内称为 "下一代显示核心材料" 的研究,究竟取得了哪些实质性进展…...

HTML实现端午节主题网站:龙舟争渡,凭吊祭江诵君赋。

名人说:龙舟争渡,助威呐喊,凭吊祭江诵君赋。——苏轼《六幺令天中节》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、项目概览:传统与现代的技术碰撞1. 核心特…...