第三代api自动化测试框架使用教程(pytest+allure+sql+yaml)

news2025/1/12 20:54:17

使用教程

  • 一、配置
    • 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和name
  extract_key:
    id: $.id
    name: $.name
  #断言表达式
  # 除了数字类型比较,其他的字符或者表达式全部带上引号,表达式必须要写在后面(必须按照格式来)
  # 断言sql为有返回值查询
  assert_expression:
    #判断响应码是否和预期一致
    code: 200
    #判断预期值是否在返回值里面(用值是否在接口返回的内容里面判断)
    body: 内容包含
    #判断json提取值是否和预期一致(用键和值比较等于,大于小于或者in判断)
    json:
      id: $.id
      name: $.name
      1: $.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 requests

    url = "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是预期结果表达式(可以写多个),当预期结果和预期结果表达式从接口返回提取的值相等时就是断言成功

    运单创建成功: $.msg
    301: $.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: 201
    body: 520
    json:
      运单创建成功: $.msg
      301: $.book_jg
    sql:
      [['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_no
  method: get
  headers: '{"token": "${token}"}'
  is_run: True
  data:
  file:
  data_type:
  extract_key:
    waybill_no: $.waybill_no
  assert_expression:
    code: 200
    body: 520
    json:
      lj520: $.waybill_no
    sql:
      [
      ['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: post
  headers: '{"token": "em123dca666333"}'
  is_run: True
  data:
    '
    {
        "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: json
  extract_key:
  assert_expression:
    code: 201
    body: 520
    json:
      运单创建成功: $.msg
      301: $.book_jg
    sql:
      [['db_test2', '$.book_jg', '<', 'SELECT book_jg FROM book where book_name=${book_name} and book_id=${book_id}']]

5、执行测试
在这里插入图片描述
6.邮箱配置和报告查看
记得先配置邮箱哦
邮箱报告,这里面的一个报告连接就是allure报告的地址
在这里插入图片描述

allure报告
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三种不同实现ublk的零拷贝I/O的方法

用户态块设备ublk&#xff0c;就是提供/dev/ublkbX这样的标准块设备给业务&#xff0c;业务读写这个块的实际IO处理由编写的用户态的代码决定。这就好比使用FUSE&#xff0c;所有对挂载于FUSE的目录的读写都是编写的IO handler来处理一样。使用用户态块设备&#xff0c;可以方便…

产品经理必读|用户研究方法总结①

众所周知&#xff0c;理解用户需求&#xff0c;识别用户痛点&#xff0c;是产品或功能成型之前绕不开的过程。而要获取到用户真实的需求和痛点&#xff0c;唯一的方法就是做用户调研。而用研的方法都有哪些呢&#xff1f;今天我就来给大家分享一下行业中常见的用研方法。 用研的…

ESP32设备驱动-VL53L0X飞行时间(激光测距)传感器驱动

VL53L0X飞行时间(激光测距)传感器驱动 文章目录 VL53L0X飞行时间(激光测距)传感器驱动1、VL53L0X介绍2、硬件准备3、软件准备4、驱动实现1、VL53L0X介绍 VL53L0X 是新一代飞行时间 (ToF) 激光测距模块,采用当今市场上最小的封装,与传统技术不同,无论目标反射率如何,都能提…

项目中开发固定表头和首列的表格【付代码】

前言 前段时间做移动端的项目&#xff0c;项目中需要一个固定表头和首列的表格&#xff0c;但由于是移动端的&#xff0c;组件库里没有类似的&#xff0c;于是&#xff0c;就去网上找看有没有类似的&#xff0c;结果越找越气&#xff0c;10个文章9个抄&#xff0c;抄也行&#…

安全狗入选网络安全行业全景图(第十版)多个细分领域

4月7日&#xff0c;安全牛正式发布第十版网络安全行业全景图。 作为国内云原生安全领导厂商&#xff0c;安全狗也凭借综合的安全能力脱颖而出入选全景图多个领域。 据悉&#xff0c;全景图报告调研基于企业自主申报&#xff0c;并对申报企业收录有严格要求&#xff0c;安全牛…

Zookeeper集群+Kafka集群

目录 一、Zookeeper Zookeeper 概述 定义 工作机制 Zookeeper特点 Zookeeper数据结构 ZooKeeper应用场景 统一命名服务 统一配置管理 统一集群管理 服务器动态上下线 软负载均衡 第一次启动选举机制 非第一次启动选举机制 二、部署Zookeeper集群 1、实验准备 2…

第60章 用户增、修、删的前端实现

1 \src\components\Users\AddUser.vue <template> <!-- elmentUI 子页面的渲染显示注意事项说明&#xff1a; 子页面的渲染显示必须的使用“<el-dialog></el-dialog>标签及其所包含的子标签&#xff0c;否则子页面将不会被渲染显示出来。” --> <…

Python学习笔记--判断语句

&#xff08;一&#xff09; 布尔类型和比较运算符 1. 布尔类型&#xff1a;判断结果 True&#xff1a;表示真&#xff08;是、肯定&#xff09; False&#xff1a;表示假&#xff08;否、否定&#xff09; """ 演示布尔类型的定义 以及比较运算符的应用 "…

BCM系统组成及控制原理

1 输入控制 由于负载能力、抗干扰能力等客观情况。许多信号量无法直接施加至MCU之上&#xff0c;须有适当的输入电路(Input circuit)将信号进行隔离、调理&#xff0c;方可安全可靠地传递给MCU。 下面以开关信号和脉冲信号2种来分述。 1)开关信号的输入。 即将系统与电源正…

高频算法:Leetcode53 最大子数组和

今天讲的是Leetcode第53题&#xff0c;最大子数组和 首先观察题目&#xff0c;题目需要我们找出具有最大和的连续子数组&#xff0c;直接拿题目中的示例来做一个演示&#xff0c;找一找什么规律下的连续子数组才能得到最大的和 先从-2开始&#xff0c;-2 1 -1 此时我们的和…

【Python】Python读写.xlsx文件(基本操作、空值补全等)

【Python】Python读写.xlsx文件&#xff08;Pandas&#xff09; 文章目录【Python】Python读写.xlsx文件&#xff08;Pandas&#xff09;1. 介绍2. Pandas读写xlsx文件2.1 基本操作2.1.1 实现任务2.1.2 代码2.1.3 结果2.2 进阶操作2.2.1 写操作2.2.2 查看数据表的基本信息2.2.2…

集中一个主题,密集学习几个月,突飞猛进

集中一个主题&#xff0c;密集学习几个月大长进 诺贝尔奖获得者西蒙发现 密集学习了几个月品牌营销的知识 长进明显 原来是有科学规律的 趣讲大白话&#xff1a;大力出奇迹 【趣讲信息科技132期】 **************************** 西蒙学习法&#xff1a;“对于一个有一定基础的人…

KANO模型-产品需求调研利器

最近要做一个项目&#xff0c;需要调研客户的真实需求&#xff0c;我们有一些可提供的功能&#xff0c;需要通过问卷调研出客户对功能的优先级需求。但问卷调研的结果能反映客户的真实需求和痛点吗&#xff1f;如何给这些需求排优先级&#xff0c;以及所占的权重&#xff1f;如…

【python】只需一段代码,剪辑一个视频——Moviepy详解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、准备二、视频剪辑三、视频拼接四、逐帧变化四、导出GIF总结前言 知道吗&#xff0c;用moviepy一行代码就能够快速剪辑视频中某个区间的片段&#xff1a; cl…

mac m1系统安装安卓手机模拟器

背景&#xff1a;本人是一名开发人员&#xff0c;本地小程序上的需要地图导航到手机上&#xff0c;所以找到一个mac&#xff08;m1&#xff09;安装安卓模拟器的方案&#xff0c;这里记录分享一下。 废话不多说直接上步骤&#xff0c;很详细跟着步骤走就能完成&#xff01;&am…

【MySQL】delete和truncate的用法和区别

一、delete和truncate的用法 有如下数据表t_student 关键字delete和truncate都用来清除表中数据&#xff0c;语法结构为&#xff1a; delete from t_student;truncate table t_student; 两条SQL操作后的结果一样&#xff1a;删除了表中数据&#xff0c;但是会保留表的结构&a…

OpenAI Embedding:快速实现聊天机器人(一)

theme: orange 本文正在参加「金石计划」 上文 OpenAI Embedding&#xff1a;基于人工智能的搜索新篇章 有讲到Embedding的基础概念以及OpenAI Embedding 的能力和应用场景&#xff0c;这篇文章讲讲如何手把手构建聊天机器人。 聊天机器人介绍 聊天机器人作为一项重要的企业级服…

Qt 数据库SQL

Qt 数据库SQL用户接口层SQL接口层驱动层创建连接数据库查询两个数据库示例用户接口层、SQL接口层和驱动层是数据库系统中的三个重要组成部分&#xff0c;它们分别负责不同的功能。 用户接口层 用户接口层 用户接口层是用户与数据库系统交互的界面。它提供了一些简单易用的工具…

HDSF 简介

目录 一、HDFS 的设计特点是 二、什么零拷贝 2.1 传统情况&#xff1a; 2.2 零拷贝技术&#xff1a; 三、什么是DMA 四、HDFS 的关键元素 五、HDFS 运行原理 六、HDFS 数据合并原理 七、HDFS 写的原理 八、HDFS 读的原理 九、分块存储 十、 安全模式 十一、 MapRedu…

如何使用微服务架构?使用过程需要注意什么?

一、使用微服务架构的规范 1.1 服务拆分 微服务的服务拆分是根据业务领域和业务功能来划分的&#xff0c;目的是将复杂的单体应用程序分解为小型、自治的服务&#xff0c;每个服务都专注于处理一个特定的业务领域或功能。 以下是微服务拆分的一些常见策略&#xff1a; 领域…