simple-pytest 框架使用指南

simple-pytest 框架使用指南

  • 一、框架介绍
    • 简介
    • 框架理念:
    • 框架地址
  • 二、实现功能
  • 三、目录结构
  • 四、依赖库
  • 五、启动方式
  • 六、使用教程
    • 1、快速开始
      • 1.1、创建用例:
      • 1.2、生成py文件
      • 1.3、运行脚本
        • 1.3.1 单个脚本运行
        • 1.3.2 全部运行
      • 1.4 报告查看
    • 2、功能介绍
      • 2.1、单个接口http请求与断言
      • 2.2、长链路业务http请求与断言
      • 2.3、数据库断言
      • 2.4、变量设置
        • 2.4.1、全局变量
        • 2.4.2 系统配置变量
      • 2.5 前后置处理
      • 2.6 环境配置切换
      • 2.7 文件读取
      • 2.8 通知

一、框架介绍

简介

simple-pytest 框架主要参考了httprunner的yaml数据驱动部分设计思路,是基于 Pytest + Pytest-html+ Log + Yaml + Mysql 实现的简易版接口自动化框架。与httprunner不同的是,httprunner是个封装好的工具包,simple-pytest 是半封装的脚本,目的是让用户自己更容易学习Pytest工具,理解框架设计。

框架理念:

1、一个yaml就是一个接口,包含了接口的请求,断言等信息。
2、脚本执行使用pytest+python代码做逻辑处理,更加方便喜欢写代码的同学
3、让新手同学更加全面的理解pytest框架
4、为了
在学这个框架前,必备的一点常识是:
1、python基础语法
2、pytest基础包括用例执行,夹具使用等

框架地址

gitee: https://gitee.com/itestxs/simple-pytest

二、实现功能

  • yaml数据驱动:实现数据驱动隔离
  • 用例标签:在py脚本中可以通过case_tag做用例过滤
  • 全局变量池:实现接口之间的关联取值
  • 多断言:支持==,!=等多种断言,支持jsonpath的取值方式
  • sql数据库断言: 直接在yaml测试用例中写入查询的sql即可断言,无需编写代码
  • 自动生成用例代码: 在yaml文件中填写好测试用例, 可以转换为py脚本。

三、目录结构

- config ====>> 项目配置文件redis,mysql等
- data ====>> 测试数据文件管理
- logs ====>> 日志记录
- reports ====>> 结果报告,包括html
- test_cases ====>> 测试用例 ├── confset.py ====>> 测试夹具
- utils ====>> 各种工具类├── assertion ====>>  断言工具
- pytest.ini ====>> pytest配置文件
- conftest.py ====>> 全局夹具配置
- requirements.txt ====>> 相关依赖包文件
- run.py ====>> 执行用例入口文件

四、依赖库

requests==2.28.1
jsonpath==0.82
fastapi==0.88.0
pymysql==1.0.2
pyyaml==5.4.1
pytest==7.4.3
pytest-html==4.1.1
py==1.11.0

五、启动方式

1、先安装pip install requirements.txt
2、启用utils下的shopping_mock模块
3、运行run.py文件,然后,查看report的结果报告即可。

六、使用教程

1、快速开始

1.1、创建用例:

在data目录下创建yaml文件

主要的字段格式如下:
title:接口名字
base_url:域名地址,不填则默认取得setting的BASE_URL,如果填写了,则直接获取填写的
path:接口请求地址
method:请求方法
request_data:统一的请求参数,比如headers
cases:测试用例集合
case_name:测试用例名字,支持多个case_name年编写
case_tag:支持参数avl、dis、only 不填则为avl。其中avl就是可用的意思,dis不可用,only是代表只有当前用例生效。如果只传入only,则其他用例则不被执行,优先级是only>dis>avl。也可以自定义打tag
json:接口的请求体,可以直接输入字典格式(自动生成的用例不是字典格式)。请注意yaml的格式
params:接口的url请求参数。(待补充用例)
assert:断言,status_code是断言请求状态码。$.data是jsonpath的表达式,目前仅支持改表达式写法。目前支持的断言方式请在assert_type.py里查看包含,大于、不等于、等于一系列判断
sql:该case关联的sql,可以将该sql用来做前置还是以及后置
extract_sql:提起该sql的返回内容的某个字段存在变量池中,$.id 也是jsonpath表达式
assert_sql:sql的断言,用法同assert

yaml 模板用例如下:

title: "查询商品"
base_url: $config{BASE_URL}
path: /items
method: GET
request_data:headers:Content-Type: application/jsontoken: $global{token}cases:- case_name: "搜索-正常"# case_tag 支持参数avl、dis、only 不填则为avl,如果只传入only,则所有case 只会返回only的数据,也可以自定义打tagcase_tag: avlassert:- eq: [ status_code, 200 ]- ne: [ $.data, "" ]sql: select * from projectInfo where project="bm-scm"extract_sql:id: $.idassert_sql:- eq: [ $.id, 1 ]- case_name: "搜索-超出范围"case_tag: avlparams: "page=2&limit=10"assert:- eq: [ status_code, 200 ]- eq: [ $.data, [] ]
# login.yaml
title: "登录"
path: /login
method: POST
request_data:headers:Content-Type: application/jsoncases:- case_name: "登录-正常"# case_tag 支持参数avl、dis、only 不填则为avl,如果只传入only,则所有case 只会返回only的数据,也可以自定义打tagcase_tag: avljson: {"username": "user1", "password": "password1"}extract:token: $.tokenassert:- eq: [status_code, 200]- ne: [$.token, ""]- case_name: "登录-用户名为空"case_tag: avljson: { "username": "", "password": "password1" }assert:- eq: [status_code, 401]- eq: [$.detail, "Invalid username or password"]

1.2、生成py文件

在utils目录下的yaml_to_py文件main修改,yaml_to_pys批量转换整个data文件夹下的yaml文件,yaml_to_py转换指定的yaml文件,参数,cover代表是否覆盖,传入true,则会覆盖你现有的。

if __name__ == '__main__':yaml_to_pys()# yaml_to_py("login.yaml")

case_datas 为自动获取测试用例集,可以通过get_case_data(case_tag=“tag”)中的case_tag去过滤特定标签用例。

1.3、运行脚本

1.3.1 单个脚本运行

每个执行py脚本都可直接右击执行

1.3.2 全部运行

点击运行run文件,可以通过testenv 参数指定获取哪个环境的配置。

1.4 报告查看

如果是单个配置,则直接在当前test_cases目录下就可以看到,如果是run脚本执行,则报告统一放在reports
目前的报告格式是pytest-html。如果要用allure,则可以自己修改使用。

2、功能介绍

2.1、单个接口http请求与断言

    response = HttpRequest.simple_request(case_data)Assert(response, case_data.get("assert")).assert_util
#!/usr/bin/env python
# -*- coding: utf-8 -*-import pytestfrom utils.assertion.assert_util import Assert
from utils.http_request import HttpRequest
from utils.read_file_data import ReadFileDataclass TestLogin():case_datas = ReadFileData("login.yaml").get_case_data()  # get_case_data("tag") 自定义tag输入@pytest.mark.parametrize('case_data', case_datas, ids=generate_ids(case_datas))def test_login(self, case_data):response = HttpRequest.simple_request(case_data)Assert(response, case_data.get("assert")).assert_utilif __name__ == '__main__':pytest.main(["test_login.py"])

2.2、长链路业务http请求与断言

该功能是添加购车然后付款的流程。 彼此之间有接口依赖问题,通常解决依赖问题有两种

  • 第一种:使用框架自带的merge_cases_data函数
    test_data = merge_cases_data(add_carts_data, order_pays_data) # 将多个用例合并。merge_cases_data 是依赖接口合并,有两个默认规则,如果两个接口用例数一样多的,如[x,y],[A,B]那用例合并后结果就是[x,A] ,[y,B],如果两个接口用例数不一样,如[x] [A,B]那结果就是[x,A],[x,B],如[x,y] [A]那结果就是[x,A],[y,A]。
  • 第二种:自己编写代码逻辑。
    每个yaml就是一个接口。获取每个yaml的接口数据,然后获取用例后if else逻辑。如果接口之前有变量依赖,请借助全局变量去取。

import pytestfrom utils.assertion.assert_util import Assert
from utils.http_request import HttpRequest
from utils.merge_cases import merge_cases_data, generate_ids
from utils.read_file_data import ReadFileDataclass TestAddPay():add_carts_data = ReadFileData("add_carts.yaml").get_case_data()  # get_case_data("tag") 自定义tag输入order_pays_data = ReadFileData("order_pays.yaml").get_case_data()test_data = merge_cases_data(add_carts_data, order_pays_data) # 将多个用例合并print("testdata",test_data)@pytest.mark.parametrize('add_carts_data,order_pays_data', test_data, ids=generate_ids(test_data,"merge"))def test_add_pay(self, add_carts_data, order_pays_data):add_carts_response = HttpRequest.simple_request(add_carts_data)# print(add_carts_response.json())Assert(add_carts_response, add_carts_data.get("assert")).assert_utilorder_pays_response = HttpRequest.simple_request(order_pays_data)# print(order_pays_response.json())Assert(order_pays_response, order_pays_data.get("assert")).assert_utilif __name__ == '__main__':pytest.main(["test_add_pay.py"])

2.3、数据库断言

需要提前在config配置settings的MYSQL_CONFIG参数

data = SqlRequest.sql_request(case_data)
Assert(data, case_data.get("assert_sql")).sql_assert_util

如果要讲数据库字段提取出来,则写在

GlobalVars.update_global_vars(key=“data”, value=data) # 将参数手动添加到公共变量中

import jsonimport pytestfrom utils.assertion.assert_util import Assert
from utils.global_vars import GlobalVars
from utils.http_request import HttpRequest
from utils.read_file_data import ReadFileData
from utils.sql_reqeust import SqlRequestclass TestSearch():case_datas = ReadFileData("search_items.yaml").get_case_data()  # get_case_data("tag") 自定义tag输入print(case_datas)@pytest.mark.parametrize('case_data', case_datas, ids=generate_ids(case_datas))def test_search_items(self, case_data):response = HttpRequest.simple_request(case_data)print(response.json())Assert(response, case_data.get("assert")).assert_util# demo1-数据库断言写法# from utils.mysql_manager import db # 注意一定要在测试用例中引用,要不然会连接不上数据库# data = db.select_db('select * from projectInfo where project="bm-scm"')# print("data",data)# GlobalVars.update_global_vars(key="data", value=data) # 将参数手动添加到公共变量中# assert data["id"] == 1# demo2-数据库断言写法data = SqlRequest.sql_request(case_data)print("data", data)GlobalVars.update_global_vars(key="data", value=data) # 将参数手动添加到公共变量中Assert(data, case_data.get("assert_sql")).sql_assert_utilif __name__ == '__main__':pytest.main(["test_search_items.py"])

2.4、变量设置

主要的变量有两种,一个是全局变量,主要是接口数据库字段等值的传参使用。一个是配置变量,拿去配置里的信息。

2.4.1、全局变量

使用用法:使用$global{}关键字获取

$global{token}

以上例子是获取全局变量中token的变量
注意:全局变量如果命名重复会导致值被替换,请使用不同的变量名。

2.4.2 系统配置变量

配置变量获取的是config里的setting值,启动的时候,会自动获取当前环境的配置

$config{BASE_URL}

2.5 前后置处理

目前前后置处理由用户自己处理,较为常用的用法是,使用pytest的夹具功能

2.6 环境配置切换

使用testenv参数即可切换生产以及测试环境的配置。默认不填的情况下,使用的是测试环境的配置。配置读取的是settings里的信息

2.7 文件读取

read_file_data提供函数,支持读取json、yaml、csv、txt等文件

2.8 通知

在config settings下配置project、feishu_key信息,运行run脚本,即可发送飞书通知,注意只有运行run脚本才可以发送飞书通知
[图片]

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

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

相关文章

小程序开发之配置服务器域名

在小程序开发中,配置服务器域名是为了允许小程序能够从指定的后端服务器获取数据或进行通信。这通常涉及以下步骤: 1. **登录微信公众平台**:首先,需要登录微信公众平台,并找到你的小程序管理页面。 2. **进入开发设…

C语言之滑动窗口问题

一、题目: 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 假设字符串中只包含从 a 到 z 的字符。 数据范围 输入字符串长度 [0,1000][0,1000]。 样例 输入:"abcabc"输出:3 二…

flutter保存图片到相册封装工具类

/// 使用 File api import dart:io;/// 使用 Uint8List 数据类型 import dart:typed_data;/// 图片缓存管理 import package:cached_network_image/cached_network_image.dart; import package:flutter/services.dart;/// 使用 DefaultCacheManager 类(可能无法自动…

设计模式(八)外观模式

相关文章设计模式系列 1.外观模式简介 外观模式介绍 当我们开发Android的时候,无论是做SDK还是封装API,我们大多都会用到外观模式,它通过一个外观类使得整个系统的结构只有一个统一的高层接口,这样能降低用户的使用成本。 外观…

2279. 网络战争(最小割,01分数规划,二分)

活动 - AcWing 给出一个带权无向图 G(V,E),每条边 e 有一个权 we。 求将点 s 和点 t 分开的一个边割集 C,使得该割集的平均边权最小,即最小化: ∑(e∈C)we/|C| 注意: 边割集的定义与最小割中的割边的集合不同。在本…

面试redis篇-10Redis集群方案-主从复制

在Redis中提供的集群方案总共有三种: 主从复制哨兵模式分片集群主从复制 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 主从数据同步原理 Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每…

在linux下配置网桥透明模式防火墙

在 Linux 下配置网桥透明模式防火墙,您可以使用 iptables 或者 nftables 来实现。下面是一个基本的示例,假设您已经有一个网桥 br0,并且想要在网桥上应用透明防火墙规则。 安装必要的工具: sudo apt update sudo apt install brid…

mybatis架构

分为三层:接口层、数据处理层、框架支撑层 那么展开解释每层职责 1.接口层:包含新增、删除、查询、修改接口。其调用方式大致分为两种:一种是基于statementId,一种是基于Mapper接口。另外还维护配置信息的接口 2.数据处理层&am…

Java SpringBoot 创建项目工程输出 Hello World

Java SpringBoot 创建项目工程输出 Hello World 1、新建项目 2、创建 controller 3、编写 Hello World 代码 package com.zhong.demo01.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.Res…

本地项目如何上传到gitee

文章目录 一、在gitee上新建远程仓库二、初始化本地仓库三、执行git命令上传代码 一、在gitee上新建远程仓库 仓库名称必填,路径自动跟仓库名称保持一致 解释说明: 仓库名称:必填,每个仓库都需要有一个名称,同一个码…

Armbian 23.11(Ubuntu 22.04)安装glances不显示docker容器状态解决办法

引流关键词: debian 系统环境信息 注意!这里只是交代!具体情况无需与我一致! 命令输出cat /proc/versionLinux version 6.6.2-edge-rockchip64 (armbiannext) (aarch64-linux-gnu-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, …

【Leetcode】150. 逆波兰表达式求值

今天做了一道leetcode,题目不算难,基本就是stack的入栈出栈,但我看了一圈别人的代码,感觉不够优雅,所以我想分享一下自己的写法,主要就是用Map和BiFunction优化4个if else Java中,函数是能以对…

kubectl 命令行管理K8S

目录 陈述式资源管理方式 介绍 命令 项目的生命周期 创建 kubectl create命令 发布 kubectl expose命令 更新 kubectl set 回滚 kubectl rollout 删除 kubectl delete 陈述式资源管理方式 介绍 1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法…

2024年用AI自动直播有效果吗?

在如今全民直播的时代,做短视频和直播已经成为多数企业、实体店必备的技能之一,全国各个头部的品牌,都在纷纷加码直播,甚至已经开启直播矩阵的体系,另外中小型商家也在思考,如何通过抖音直播,让…

量子前沿:美国计算社区联盟CCC发布量子计算进展最新研报!

内容来源:量子前哨(ID:Qforepost) 编辑丨慕一 编译/排版丨沛贤 深度好文:1800字丨12分钟阅读 近日,美国计算社区联盟 (CCC) 发布了过去五年量子计算进展的最新报告。CCC还分享了美国东北大学库里计算机科…

XGB-12:在 Kubernetes 上进行分布式 XGBoost 训练

通过 Kubeflow XGBoost Training Operator 支持在 Kubernetes 上进行分布式 XGBoost 训练和批量预测。 操作步骤 为在 Kubernetes 集群上运行 XGBoost 作业,执行以下步骤: 在 Kubernetes 集群上安装 XGBoost Operator。 XGBoost Operator 旨在管理 XGB…

从零开始学Spring Boot系列-Hello World

欢迎来到从零开始学Spring Boot的旅程!我们将从一个非常基础但重要的示例开始:创建一个简单的Spring Boot应用程序,并输出“Hello World”。 1. 环境准备 首先,确保你的开发环境已经安装了以下工具: Java Development …

word、wps插入参考文献

word 首先为参考文献自定义一个编号列表,开始->有序编号->定义新的编号格式,如下图所示: 在输入编号的格式中输入编号列表的形式,然后输入1;将编号样式改为1,2,3形式,不然就会…

dbt-core中的模型

在dbt中,模型(model)是核心概念之一,它代表了一个或多个SQL查询,这些查询定义了如何从源数据转换和构建目标数据表。除了SQL模型外,还有一个python模型,这里后面再进行探索. 以下是一些关于dbt模型的主要概念和注意事…

趣学贝叶斯定理:贝叶斯定理的先验概率、似然和后验概率(2)

4. 比较非归一化的后验概率 首先,我们需要求出两个后验概率的比值 P ( D ∣ H 1 ) P ( D ∣ H 2 ) \frac{P(D|H1)}{P(D|H2)} P(D∣H2)P(D∣H1)​ 接下来,用贝叶斯定理将其中的每一项都展开。 所以这个后验概率比值告诉我们,在不知道P(D)的…