第三代api自动化测试框架使用教程(pytest+allure+sql+yaml)
使用教程
- 一、配置
- 1、环境配置
- 2、框架配置
- 3、启动入口
- 二、用例编写
- 1、用例模板
- 2、参数依赖写法
- 2、函数(方法插件)写法
- 3、接口上传文件和表单参数
- 4、接口上传json参数
- 5、接口无数据填写
- 6、code断言
- 7、body断言
- 7、json断言
- 8、sql断言
- 9、完整断言写法:
- 三、邮件发送
- 四、全局前后置
- 五、测试
一、配置
1、环境配置
环境名称:自定义名称
headers:键值对字典格式,注意写法格式
http:协议http://或这https://
2、框架配置
Environment:框架测试环境配置,使用之前自定义的环境的名称
log_path:日志这里用自己电脑的文件路径
exclude_dir:执行用例要排除的case下的二级目录,例:‘bd’
exclude_file:执行用例要排除的case下的文件 例:‘case/mb.yaml’
raw_case_path:当前用例原始文件总目录
MYSQL_CONFIG:MYSQL_CONFIG_1,MYSQL_CONFIG_2数据库配置,使用数据库操作时使用,需要几个就写几个
submodule_list:子模块,用于数据统计,就是case目录下的所有二级目录(暂时无用)
case_amount_sum,case_amount_execute:数据统计需要无需修改
3、启动入口
二、用例编写
1、用例模板
使用请严格按照格式编写用例
#用例(名称)标题,需要参数依赖的全部设置字符格式,后期解析成字典列表等格式
用例标题0:#接口地址,也支持参数依赖,没写path: /test/${id}#请求方法method: post#有值就用这个,没用就使用默认配置的,有header里面使用参数依赖的场景headers: '{"token":"${token}"}'# 是否运行is_run: False# 前置sql:sql有2大类,一个是查询有返回值,一个是增删改无返回值,前置sql为无返回值类型# precondition_sql:# - UPDATE case_test SET title = '标题2', ex = '44' WHERE id = 2# - UPDATE case_test SET title = '标题3', ex = '55' WHERE id = 3#请求参数较多,这里就使用原始字典格式,除了提取表达式,其他的都带上引号,预防出错,random_time()随机函数使用data:'{"id":${id},"projectNo": "320SF000206004","name": ${name},"time": ${random_int()},}'#上传文件,文件名路径必须是英文file:'[("file", ("bug.xlsx", open("C:/Users/Cassie/Desktop/bug.xlsx", "rb"),"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))]'#参数类型 json 或者 form表单data_type: json#从接口返回结果提取哪些字段和提取表达式,比如从返回数据提取用户id和nameextract_key:id: $.idname: $.name#断言表达式# 除了数字类型比较,其他的字符或者表达式全部带上引号,表达式必须要写在后面(必须按照格式来)# 断言sql为有返回值查询assert_expression:#判断响应码是否和预期一致code: 200#判断预期值是否在返回值里面(用值是否在接口返回的内容里面判断)body: 内容包含#判断json提取值是否和预期一致(用键和值比较等于,大于小于或者in判断)json:id: $.idname: $.name1: $.int#判断sql查询值是否和预期一致(用键和值作判断,规则和上面一致)sql:#外层一个大列表,里面没个小列表就是一个sql断言#小列表断言元素1是数据库名,第二个是比较值,第三个是逻辑运算符,第四个是sql[["db_test2","$.book_jg","<","SELECT book_name FROM book where book_name=${book_name}"],["db_test","$.title","==","SELECT title FROM case where id=${id}"]]
2、参数依赖写法
参数依赖可以写在path,headers,data里面
参数池{‘id’:1,‘name’:‘kk’,‘info’:{‘wo’:2}}
${id}
: 相当于在参数池子里面取id的值也就是1
${info.wo}
: 相当于在参数池子里面取wo的值也就是2
2、函数(方法插件)写法
${random_int()}
:使用函数里面的这个方法
3、接口上传文件和表单参数
data:使用引号包起来的字典,作为接口表单格式参数发送(复制data里面的数据在外面加上引号)
file:使用引号包起来的python文件对象,作为接口文件格式参数发送(复制file里面的数据在外面加上引号)
调试代码
data_type: 设置为form
import requestsurl = "https://xx/file"data= {'uid': '78axx90011','file_name': 'bug.xlsx','file_type': 'proof_of_address'}files = [('raw_body', ('bug.xlsx', open('C:/Users/Cassie/Desktop/bug.xlsx', 'rb'), 'text/plain'))]headers = {'Authorization': 'Bearer eyJ0xxxe','Accept': 'application/json'}response = requests.request("POST", url, headers=headers, data=data, files=files)print(response.text)
用例写法
data:"{'uid': '78asdf99890011','file_name': 'bug.xlsx','file_type': 'proof_of_address'}"file:"[('raw_body', ('bug.xlsx', open('C:/Users/Cassie/Desktop/bug.xlsx', 'rb'), 'text/plain'))]"data_type: form
4、接口上传json参数
data:使用引号包起来的字典,作为接口json格式参数发送(复制data里面的数据在外面加上引号)
file:不填
data_type: 设置为 json
data:'{"waybill_no":"${waybill_no}","lu_dan_ren":"${cc1}","aa":[{"a":"${random_str(22)}"},{"b":"${random_int(2)}"},{"c":"${cc1}"},{"d":{"d1":"${random_int(2)}"}}]}'file:data_type: json
5、接口无数据填写
都填空,不写
data:
file:
data_type:
6、code断言
需要填写预期接口返回码,完全相等就是断言成功
code: 200
7、body断言
填写预期接口返回的内容,该内容在接口返回数据里面就是断言成功
body: 520
7、json断言
运单创建成功,301是预期结果,$.msg
,$.book_jg
是预期结果表达式(可以写多个),当预期结果和预期结果表达式从接口返回提取的值相等时就是断言成功
运单创建成功: $.msg301: $.book_jg
8、sql断言
格式是一个大列表嵌套一个或者多个小列表,几条sql断言就几个小列表
sql断言第一个值: db_test2,数据库对象,需要先在config.py配置里面写上数据库连接数据,然后去mysql_.py里面生成数据库对象,然后把对象名写在db_list=[‘db_test’,‘db_test2’]上。只有在db_list里面的数据库才可以进行断言使用
sql断言第二个值:预期结果,可以写明确的值,也可以去写$.book_jg
去接口返回值里面拿数据作为预期结果
sql断言第三个值:逻辑运算符 < > ==
sql断言第四个值:sql语句,可以在sql语句里面使用${case_id}
去接口返回里面拿值来用,和参数依赖一样都是使用jsonpath去提取的写法。
[['db_test2', '$.book_jg', '<', 'SELECT book_jg FROM book where book_name=${book_name} and book_id=${book_id}']]
9、完整断言写法:
assert_expression:code: 201body: 520json:运单创建成功: $.msg301: $.book_jgsql:[['db_test2', '$.book_jg', '<', 'SELECT book_jg FROM book where book_name=${book_name} and book_id=${book_id}']]
三、邮件发送
配置邮箱的发送邮箱,和授权码(指定163邮箱和该邮箱的授权码)
收件人支持其他邮箱,填写格式如下
# 邮箱的地址
addresser = "xxn@163.com"
# 授权码
authorization_code = "xxxxxTN"
# 收件人
recipients=['xxxxx@gmail.com', 'lxxx@163.com']
四、全局前后置
可以自定义前置干什么后置干什么,我这边只写了后置数据统计和邮件发送
五、测试
1、启动mock接口
2、配置环境,配置mock接口的协议和域名
3、配置环境名称和用例执行目录配置,最多支持2级目录,一般一个目录一个模块
4、用例编写
获取运单号:path: /get_waybill_nomethod: getheaders: '{"token": "${token}"}'is_run: Truedata:file:data_type:extract_key:waybill_no: $.waybill_noassert_expression:code: 200body: 520json:lj520: $.waybill_nosql:[['db_test2', '$.book_jg', '<', 'SELECT book_jg FROM book where book_name=${book_name} and book_id=${book_id}'],['db_test', '$.title', '==', 'SELECT title FROM case_t where case_id=${case_id}'],['db_test', '唤醒不了', '==', 'SELECT title FROM case_t where case_id=2']]录单:path: /lu_dan?aa=${cc1}method: postheaders: '{"token": "em123dca666333"}'is_run: Truedata:'{"waybill_no":"${waybill_no}","lu_dan_ren":"${random_int(21)}","aa":[{"a":"${random_str(22)}"},{"b":"${random_int(2)}"},{"c":"${cc1}"},{"d":{"d1":"${random_int(21)}"}}]}'file:data_type: jsonextract_key:assert_expression:code: 201body: 520json:运单创建成功: $.msg301: $.book_jgsql:[['db_test2', '$.book_jg', '<', 'SELECT book_jg FROM book where book_name=${book_name} and book_id=${book_id}']]
5、执行测试
6.邮箱配置和报告查看
记得先配置邮箱哦
邮箱报告,这里面的一个报告连接就是allure报告的地址
allure报告
相关文章:

第三代api自动化测试框架使用教程(pytest+allure+sql+yaml)
使用教程一、配置1、环境配置2、框架配置3、启动入口二、用例编写1、用例模板2、参数依赖写法2、函数(方法插件)写法3、接口上传文件和表单参数4、接口上传json参数5、接口无数据填写6、code断言7、body断言7、json断言8、sql断言9、完整断言写法&#x…...

Qt——实现一个获取本机网络信息的界面
效果展现 代码实现 networkinformation.h: #ifndef NETWORKINFORMATION_H #define NETWORKINFORMATION_H#include <QMainWindow> #include <QLabel> #include <QLineEdit> #include <QPushButton>class NetworkInformation : public QMai…...

全面深入了解接口自动化,看完还不会我报地址
一、自动化分类 (1)接口自动化 python/javarequestsunittest框架来实现 python/javaRF(RobotFramework)框架来实现——对于编程要求不高 (2)Web UI功能自动化 python/javaseleniumunittestddtPO框架来实…...

Python 小型项目大全 61~65
六十一、ROT13 密码 原文:http://inventwithpython.com/bigbookpython/project61.html ROT13 密码是最简单的加密算法之一,代表“旋转 13 个空格”密码将字母A到Z表示为数字 0 到 25,加密后的字母距离明文字母 13 个空格: A变成N&…...

Hlog
Hlog 简介 Hlog是Hbase实现WAL(Write ahead log )方式产生的日志信息 , 内部是一个简单的顺序日志。每个RegionServer对应1个Hlog(备注:1.X版本的可以开启MultiWAL功能,允许对应多个Hlog),所有对于该RegionServer的写入都会被记录到Hlog中。H…...

学编程应该选择什么操作系统?
今天来聊一个老生常谈的问题,学编程时到底选择什么操作系统?Mac、Windows,还是别的什么。。 作为一个每种操作系统都用过很多年的程序员,我会结合我自己的经历来给大家一些参考和建议。 接下来先分别聊聊每种操作系统的优点和不…...

Oracle基础部分二(伪列/表、单个函数、空值处理、行列转换、分析函数、集合运算)
Oracle基础部分二(伪列/表、单个函数、空值处理、行列转换、分析函数、集合运算)1 伪列、伪表1.1 伪列1.2 伪表2 单个函数2.1 常用字符串函数2.1.1 length() 询指定字符的长度2.1.2 substr() 用于截取字符串2.1.3 concat() 用于字符串拼接2.2 常用数值函…...

c/c++:原码,反码,补码和常见的数据类型取值范围,溢出
c/c:原码,反码,补码和常见的数据类型取值范围,溢出 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的话, 我所知道的周边的会c的同学,可手握…...
Java题目训练——年终奖和迷宫问题
目录 一、年终奖 二、迷宫问题 一、年终奖 题目描述: 小东所在公司要发年终奖,而小东恰好获得了最高福利,他要在公司年会上参与一个抽奖游戏,游戏在一个6*6的棋盘上进行,上面放着36个价值不等的礼物, 每…...

ORACLE EBS系统应用基础概述(1)
一、前言 有网友在论坛发帖惊呼:好不容易把EBS系统安装好了,进去一看傻眼了,不知道从哪儿下手?发出惊叹的这位网友所遇到的问题,实际上也是很多人曾经遇到或正在遇到的问题。长期以来,国内的非专业人士&am…...
电子科技大学信息与通信工程学院2023考研复试总结
一、笔试 笔试主要考察数字逻辑(数电)的相关知识,满分200分,需要复习的内容不多且知识点比较集中。根据考场上实际感受,题目难度不大但是题量稍大,2h完成试卷几乎没有多少剩余时间。笔试的体型分为填空题、…...

神经网络激活函数
神经网络激活函数神经网络激活函数的定义为什么神经网络要用激活函数神经网络激活函数的求导Sigmoid激活函数Tanh激活函数Softmax激活函数神经网络激活函数的定义 所谓激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数…...
2.C 语言基本语法
文章目录二、C 语言基本语法1.语句2.表达式3.语句块4.空格5.注释6.printf()函数基本用法7.占位符8.输出格式10.标准库,头文件提示:以下是本篇文章正文内容,下面案例可供参考 二、C 语言基本语法 1.语句 C语言的代码由一行行语句࿰…...

Qt 6.5 LTS 正式发布
Qt 6.5 LTS 已正式发布。此版本为图形和 UI 开发者以及应用程序后端引入了许多新功能,还包含许多修复和通用的改进。Qt 6.5 将成为商业许可证持有者的长期支持 (LTS) 版本。 部分更新亮点: 改进主题和样式 使用 Qt 6.5,应用程序能够便捷地支持…...

Linux权限提升—定时任务、环境变量、权限配置不当、数据库等提权
Linux权限提升—定时任务、环境变量、权限配置不当、数据库等提权1. 前言1.1. 如何找编译好的EXP2. 定时任务提权2.1. 查看定时任务2.2. 通配符注入提权2.2.1. 创建执行脚本2.2.2. 创建定时任务2.2.3. 查看效果2.2.4. 提权操作2.2.4.1. 切换普通用户2.2.4.2. 执行命令2.2.4.3. …...
Python爬虫——使用requests和beautifulsoup4库来爬取指定网页的信息
以下是一个简单的Python代码,使用requests和beautifulsoup4库来爬取指定网页的信息: import requests from bs4 import BeautifulSoupurl "https://example.com"# 发送GET请求,获取网页内容 response requests.get(url)# 将网页内…...

基于Java3D的网络三维技术的设计与实现
3D图形技术并不是一个新话题,在图形工作站以至于PC机上早已日臻成熟,并已应用到各个领域。然而互联网的出现,却使3D图形技术发生了和正在发生着微妙而深刻的变化。Web3D协会(前身是VRML协会)最先使用Web3D术语…...

python机器学习数据建模与分析——数据预测与预测建模
文章目录前言一、预测建模1.1 预测建模涉及的方面:1.2 预测建模的几何理解1.3 预测模型参数估计的基本策略1.4 有监督学习算法与损失函数:1.5 参数解空间和搜索策略1.6 预测模型的评价1.6.1 模型误差的评价指标1.6.2 模型的图形化评价工具1.6.3 训练误差…...

Flink系列-6、Flink DataSet的Transformation
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址:https://flink.apache.org/ 学习资料:https://flink-learning.org.cn/ 目录Flink 算子Ma…...
Java-类的知识进阶
Java类的知识进阶 类的继承(扩张类) Java类的继承是指一个类可以继承另一个类的属性和方法,从而使得子类可以重用父类的代码。继承是面向对象编程中的重要概念,它可以帮助我们避免重复编写代码,提高代码的复用性和可…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...