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

pytest+yaml实现接口自动化框架

前言

httprunner 用 yaml 文件实现接口自动化框架很好用,最近在看 pytest 框架,于是参考 httprunner的用例格式,写了一个差不多的 pytest 版的简易框架

项目结构设计

项目结构完全符合 pytest 的项目结构,pytest 是查找 test_.py 文件,我这里是查找 test_.yml 文件,唯一不同的就是这个地方
以前写test_*.py 的测试用例,现在完全不用写了,全部写yaml 文件就行,项目结构参考

只需在 conftest.py 即可实现,代码量超级少
pytest 7.x最新版

def pytest_collect_file(parent, file_path):# 获取文件.yml 文件,匹配规则if file_path.suffix == ".yml" and file_path.name.startswith("test"):return YamlFile.from_parent(parent, path=file_path)

pytest 5.x以上版本

import pytest
import requestsdef pytest_collect_file(parent, path):# 获取文件.yml 文件,匹配规则if path.ext == ".yml" and path.basename.startswith("test"):# print(path)# print(parent)# return YamlFile(path, parent)return YamlFile.from_parent(parent, fspath=path)class YamlFile(pytest.File):# 读取文件内容def collect(self):import yamlraw = yaml.safe_load(self.fspath.open(encoding='utf-8'))for yaml_case in raw:name = yaml_case["test"]["name"]values = yaml_case["test"]yield YamlTest.from_parent(self, name=name, values=values)class YamlTest(pytest.Item):def __init__(self, name, parent, values):super(YamlTest, self).__init__(name, parent)self.name = nameself.values = valuesself.request = self.values.get("request")self.validate = self.values.get("validate")self.s = requests.session()def runtest(self):# 运行用例request_data = self.values["request"]# print(request_data)response = self.s.request(**request_data)print("\n", response.text)# 断言self.assert_response(response, self.validate)def assert_response(self, response, validate):'''设置断言'''import jsonpathfor i in validate:if "eq" in i.keys():yaml_result = i.get("eq")[0]actual_result = jsonpath.jsonpath(response.json(), yaml_result)expect_result = i.get("eq")[1]print("实际结果:%s" % actual_result)print("期望结果:%s" % expect_result)assert actual_result[0] == expect_result

pytest 4.x 以下版本

import pytest
import requests
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/def pytest_collect_file(parent, path):# 获取文件.yml 文件,匹配规则if path.ext == ".yml" and path.basename.startswith("test"):# print(path)# print(parent)return YamlFile(path, parent)class YamlFile(pytest.File):# 读取文件内容def collect(self):import yamlraw = yaml.safe_load(self.fspath.open(encoding='utf-8'))for yaml_case in raw:name = yaml_case["test"]["name"]values = yaml_case["test"]yield YamlTest(name, self, values)class YamlTest(pytest.Item):def __init__(self, name, parent, values):super(YamlTest, self).__init__(name, parent)self.name = nameself.values = valuesself.request = self.values.get("request")self.validate = self.values.get("validate")self.s = requests.session()def runtest(self):# 运行用例request_data = self.values["request"]# print(request_data)response = self.s.request(**request_data)print("\n", response.text)# 断言self.assert_response(response, self.validate)def assert_response(self, response, validate):'''设置断言'''import jsonpathfor i in validate:if "eq" in i.keys():yaml_result = i.get("eq")[0]actual_result = jsonpath.jsonpath(response.json(), yaml_result)expect_result = i.get("eq")[1]print("实际结果:%s" % actual_result)print("期望结果:%s" % expect_result)assert actual_result[0] == expect_result

断言这部分,目前只写了判断相等,仅供参考,支持jsonpath来提取json数据

yaml格式的用例

在项目的任意目录,只要是符合test_开头的yml文件,我们就认为是测试用例
test_login.yml的内容如下

- test:name: login case1request:url: http://49.235.x.x:7000/api/v1/login/method: POSTheaders:Content-Type: application/jsonUser-Agent: python-requests/2.18.4json:username: testpassword: 123456validate:- eq: [$.msg, login success!]- eq: [$.code, 0]- test:name: login case2request:url: 49.235.x.x:7000/api/v1/login/method: POSTheaders:Content-Type: application/jsonUser-Agent: python-requests/2.18.4json:username: testpassword: 123456validate:- eq: [$.msg, login success!]- eq: [$.code, 0]

运行用例

运行用例,完全符合pytest的只需用例风格,支持allure报告

pytest -v

D:\soft\api_pytest_1208>pytest -v
====================== test session starts ======================
platform win32 -- Python 3.6.6, pytest-4.5.0, py-1.9.0,
cachedir: .pytest_cache
rootdir: D:\soft\api_pytest_1208
plugins: allure-pytest-2.8.6
collected 4 itemsdata/test_login.yml::login case1 PASSED                    [ 25%]
data/test_login.yml::login case2 PASSED                    [ 50%]
data/test_login1.yml::login case1 PASSED                   [ 75%]
data/test_login1.yml::login case2 PASSED                   [100%]=================== 4 passed in 1.34 seconds ====================

allure报告

pytest --alluredir ./report

目前是把 yaml 文件下每个 test 当一个用例执行,后续还可以加上提取参数,参数关联更高级的功能!

这可能是B站最详细的pytest自动化测试框架教程,整整100小时,全程实战!!!

相关文章:

pytest+yaml实现接口自动化框架

前言 httprunner 用 yaml 文件实现接口自动化框架很好用,最近在看 pytest 框架,于是参考 httprunner的用例格式,写了一个差不多的 pytest 版的简易框架 项目结构设计 项目结构完全符合 pytest 的项目结构,pytest 是查找 test_.…...

编译器使用优化后出现的busfault

遇到的问题: 未开优化是正常执行,打开优化,无法运行,定位到异常语句 //ADC_REG 是ADC结果寄存器地址 uint32 adc *(uint32 *)ADC_REG; uint32 temp adc&0xffff;未优化汇编代码 //uint32 adc *(uint32*)ADC_REG; MOVW R…...

rebase current onto selected作用

rebase current onto selected作用 "rebase current onto selected"是一个版本控制工具中的命令,通常用于将当前分支的修改合并到已选定的分支中,以保持代码库的整洁性和可维护性。 具体来说,这个命令会将当前分支的提交历史记录…...

深度学习入门

全连接批量归一化 目的是:只有一个学习率, 通过归一化,让所有的 x i x_i xi​具有一样的分布,则对每个参数 w i w_i wi​梯度的作用是相当的实现是:实际上是在全连接中增加了两个节点 γ \gamma γ, β \beta β 卷积…...

嵌入式图像处理机器视觉库YMCV使用

YMCV入门 一个可以免操作系统的机器视觉库,由c语言编写可以跑在单片机上。项目地址https://gitee.com/yao_mi/ymcv 使用的时候,可以参考他们的教程和demo,建议先看教程,上面有架构说明。 一个典型的应用就是渲染器,需…...

vscode设置pycharm中的项目路径和debug方法

真大佬在这 真大佬在这 必须给大佬star 命令行运行: export PYTHONPATH:pwd:/home/bennie/bennie/bennie_project/AI_Lab python main.py 当关闭此命令行时,临时路径会清除,可以将上述export的整条语句,加入~/.bashrc中 该命令中…...

10-27 maven概念

maven maven的概念模型: 项目对象模型(POM: Project object Model),一组标准集合: pom.xml 依赖管理系统(Dependency Management System) 项目生命周期(Project Lifecycle) 项目对象模型: 把项目当成一个对象,描述这个项目,使用p…...

SQL审计是什么意思?目的是什么?有什么好处?

很多刚入行的运维小伙伴对于SQL审计不是很了解,不知道其是什么意思?使用SQL审计的目的是什么?使用SQL审计的好处有哪些?这里我们大家就来一起聊聊,仅供参考哈! SQL审计是什么意思? 【回答】&…...

CSS 网页布局

网页布局有很多种方式&#xff0c;一般分为以下几个部分&#xff1a;头部区域、菜单导航区域、内容区域、底部区域&#xff1a; 1&#xff09;、头部区域位于整个网页的顶部&#xff0c;一般用于设置网页的标题或者网页的logo。 <style> body { margin: 0; } /* 头部样…...

智慧燃气管网监测系统功能简要介绍

关键词&#xff1a;智慧燃气、智慧燃气管网、智慧燃气管网监测、智慧燃气管网监测系统、智慧燃气解决方案 燃气作为城市主要燃料&#xff0c;遍布整个城区&#xff0c;其安全运行直接关系到居民的生命安全&#xff0c;不可不重视。 智慧燃气中的GIS和SCADA系统&#xff0c;可…...

深度解析:如何开发一对一交友App的关键要素和流程

在数字化时代&#xff0c;人们越来越倾向于使用交友App来寻找自己的伴侣或交流朋友。而一对一交友App的开发成为了创业者们追逐的热门领域。本文将深入探讨一对一交友App开发的关键要素和流程&#xff0c;帮助您在竞争激烈的市场中脱颖而出。 关键要素&#xff1a;打造独特的用…...

ClickHouse 学习之从高级到监控以及备份(二)

第 一 部分 高级篇 第 1 章 Explain 查看执行计划 在 clickhouse 20.6 版本之前要查看 SQL 语句的执行计划需要设置日志级别为 trace 才能可以看到&#xff0c;并且只能真正执行 sql&#xff0c;在执行日志里面查看。在 20.6 版本引入了原生的执行计划的语法。在 20.6.3 版本成…...

「随笔」IT行业哪个方向比较好就业

一、IT行业就业的PEST分析 在当前的全球经济环境下&#xff0c;IT行业的发展迅速&#xff0c;就业前景广阔。以下从政治、经济、社会和科技四个维度对IT行业就业进行PEST分析。 1.1 政治&#xff08;Political&#xff09; 政府政策&#xff1a;近年来&#xff0c;各国政府都…...

Halcon WPF 开发学习笔记(0):开篇介绍

文章目录 文章专栏Halcon是什么&#xff1f;安装教学视频链接简单来说 Halcon快速开发环境确认新建项目 文章专栏 Halcon开发 Halcon是什么&#xff1f; 史上最全VisionPro和Halcon 的详细对比 Halcon简述 Halcon基础大全&#xff08;基础算子、高阶算子、数组、分割、字符检测…...

SLAM中求导相关的公式总结

李代数与李群的关系 R ˙ R T \dot{R}R^{T} R˙RT 是一个反对称矩阵&#xff0c;所以这个矩阵可以用一个13向量进行反对称来表示 R ˙ R T Φ ^ \dot{R}R^{T}Φ^{\hat{}} R˙RTΦ^ &#xff0c; 根据十四讲 4.8 的推导&#xff0c;最后则有 R ( t ) ˙ Φ ^ ⋅ R ( t ) \d…...

在微信小程序中怎么做投票活动

在当今社交媒体时代&#xff0c;微信小程序已经成为一种广泛使用的互动营销工具。通过各种活动&#xff0c;企业可以吸引用户的关注&#xff0c;提升品牌影响力。其中&#xff0c;投票活动是一种特别受欢迎的形式。本文将为你详细介绍如何在微信小程序中创建投票活动。 一、微信…...

如何使用 NFTScan NFT API 在 Arbitrum 网络上开发 Web3 应用

Arbitrum 是以太坊的 Layer 2 扩容方案&#xff0c;为以太坊面临的高 gas 费和网络拥堵问题&#xff0c;提供了一个解决方案。作为 Layer 1 的以太坊基础层受每秒只能验算 15 笔交易的限制&#xff0c;在目前以太坊使用需求庞大的情况下&#xff0c;局限了以太坊的可扩展性。Ar…...

线上问题排查方法

查看栈信息 先进入docker容器,docker exec -it 容器号 bash *查看线程占用排行top -Hp 1,此处PID为线程号 查看各线程情况jstack -l 1 可以将栈信息生成文件jstack -l 1 > 2.log 查看对应线程号的信息,比如要看线程号PID是28的,那么28的16进制是1C,则检索栈文件里ox1…...

智能柜+MRO:制造业中的自动售货机

每当谈及企业数字化转型&#xff0c;多数人想到的是人工智能、大数据等高端技术的应用&#xff0c;或是原有业务流程和运营方式的数字化与自动化&#xff0c;实现大幅降本增效等。然而&#xff0c;对于急需在数字时代找到生存之道的企业来说&#xff0c;数字化转型的要求远不止…...

flutter笔记:骨架化加载器

flutter笔记 骨架化加载器 - 文章信息 - Author: Jack Lee (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/134224135 【介绍】&#xff1a;本文介…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...