第三代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类的继承是指一个类可以继承另一个类的属性和方法,从而使得子类可以重用父类的代码。继承是面向对象编程中的重要概念,它可以帮助我们避免重复编写代码,提高代码的复用性和可…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...