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

使用Pytest进行接口自动化测试(三)

(一)YAML

之前在项目中,我们也是用过YAML来做配置文件,他用于以人类可读的形式存储信息,
特点: 一种简易的可读语言,用于人和计算机交换数据
          通常用来存储配置信息
          跟python类似,有着严格的缩进
          跟其他配置文件不一样,没有多余的符号("",{})等
注: 上篇博客我们还说了.ini文件,与他不同的是,YAML是区分大小写的,且严格遵循缩进

  他的文件后缀名.yaml或者.yml  YAML支持多种数据类型,具体有点多这里不详细列出
我们有很多工具可以帮我们把各种格式的文件转为yml格式的文件
JSON 转 YAML 工具 | 简化数据格式转换 - 嘉澍工具


YAML的使用


我们需要先下载YAML
下载完成后,我们就可以手动写yml文件,或者使用命令来写yml文件了
 

import yaml
#追加写入文件(f即为打开的文件)
def wirte_yaml(filename,data):with open(filename,encoding="utf-8",mode="a")as f:yaml.safe_dump(data,stream=f)
#读文件
def read_yaml(filename,key):with open(filename,encoding="utf-8",mode="r")as f:data=yaml.safe_load(f)return data[key]
#清空
def clear_yaml(filename):with open(filename,encoding="utf-8",mode="w")as f:f.truncate()
def test01():data={"string":"123"}wirte_yaml("pytest.yml",data)ret=read_yaml("pytest.yml","string")print("ret",ret)clear_yaml("pytest.yml")

yaml.safe_dump:这个函数会将python对象转为yml格式再给写入到yml文件中

yml.safe_load:这个函数会将yml格式对象转换为python对象

文件名.truncate:这个函数用来清空文件中数据
结果如下

(二)JSON Schema

用来校验json是否符合我们的预期
还是需要我们手动安装

那具体是如何帮我们验证json格式是否符合预期?

这是我们JSON的一个代码块
我们来看他对应的jsonSchema代码块
我们分别再来看一下Json Schema的属性都是什么
首先就是type,这个用来指定json传输的类型

  • 可以是字符串(string)、数字(number)、整数(integer)、对象(object)、数组(array)、布尔值(boolean)或null。

  • 也可以是一个数组,表示允许多种类型。例如:"type": ["string", "null"]表示可以是字符串或null

再来看required,(用于object类型)这个里面表示我们下面的properties哪些是必须要有的

properties 同样用于object类型,这里面表示object里面的键和对应值的数据类型
我们可以使用工具,将JSON转为Json Schema
但是这个工具可能会出错(容易把布尔类型,转成字符串),所以需要我们再校验一遍
在线JSON转Schema工具 - ToolTT在线工具箱
我们自己写个代码,来看一下
 

from jsonschema.validators import validate
#不要忘记导入jsonschema
def test02():json01={"code":"SUCCESS","error":"","data":False}jsonschema={"type": "object","required": [],"properties": {"code": {"type": "string"},"msg": {"type": "string"},"data": {"type": "boolean"}}
}validate(json01,jsonschema)

然后我们来看结果

我们properties是一个验证关键字,除了要写json对应的键和值的类型外,我们也可以指定一些其他的值,比如

最大最小值

:minimum 和 maximum:指定数值的最小值和最大值
exclusiveMinimum 和 exclusiveMaximum:指定数值必须严格大于或在小于某个值
这里举一个简单的例子
 

def test02():json01={"code":"SUCCESS","num":-1,"data":False}jsonschema={"type": "object","required": [],"properties": {"code": {"type": "string"},"num": {"type": "number","minimum": 0},"data": {"type": "boolean"}}
}

比如我把num设定为-1,但在jsonschema中,我把num最小数值设定为0,这样就会报错

这里来说一下minimum和exclusiveMinimum的区别(maximum同理)

在Draft6之后
minimum就是我们常说的<=,exclusiceMinimum是<,且值都可以为数字
在Draft4之前

exclusiveMinimum必须是布尔值

需要与 minimum配合使用


pattrern字符串特殊校验

pattern使用正则表达是来验证字符串是否符合特定的模式
具体正则表达式怎么写,我们同样可以使用生成器
正则表达式生成器,常用正则表达式在线生成
 

数组约束


minItems和maxItems:指定数组的最小和最大长度
uniqueItems:确保数组中的元素是唯一的

true代表数组中不可以有重复元素
items:定义数组中每个元素的类型和约束

{"type": "array","items": {"type": "number","minimum": 0}
}

这里定义数组中所有的元素都为number

{"type": "array","items": [{"type": "string"},  // 第一个元素必须是字符串{"type": "number"},  // 第二个元素必须是数字{"type": "boolean"}  // 第三个元素必须是布尔值],"additionalItems": false  // 禁止额外元素
}

也可以使用元组模式定义每个位置元素
contains:必须包含特定元素
 

{"type": "array","contains": {"type": "string","pattern": "^admin$"}
}

对象约束

minProperties和maxProperties:指定对象的最小和最大属性数量
additionalProperties:控制是否允许对象中出现在在properties中未定义的额外属性,默认为True
propertyNames- 约束属性名:通过正则表达式约束properties中属性名称
 

{"type": "object","propertyNames": {"pattern": "^[a-z][a-z0-9_]*$","maxLength": 20}
}

必需属性

通过required关键字,Json Schema指定哪些属性是必须的,如果JSON实例中缺少这些必要属性,验证就会失败

{"type": "object","properties": {"name": { "type": "string" },"email": { "type": "string" }
},"required": ["name", "email"]
}

依赖关系

dependentRequired可以定义属性之间的依赖关系   如果一个属性存在,则必须存在另一个属性
 

{"type": "object","properties": {"creditCard": { "type": "string" },"billingAddress": { "type": "string" }},"dependentRequired": {"creditCard": ["billingAddress"]}
}

这就表示我们的creditCard依赖billingAddress当有creditCard时,就一定要有billingAddress
 

logging日志模块


logging是Python库中的一个模块,提供了灵活的日志功能
接下来我们看一下logging是怎样使用的


import logging# 配置日志:设置级别和格式
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 创建日志记录器
logger = logging.getLogger(__name__)# 记录不同级别的日志
logger.debug('这是一条调试信息')
logger.info('这是一条普通信息')
logger.warning('这是一条警告信息')
logger.error('这是一条错误信息')
logger.critical('这是一条严重错误信息'

设置日志文件格式我们也可以这样写

handler.setFormatter(formatter)将创建的格式器对象设置到处理器上,这样处理器在接受到日志信息时,就会用这个格式器来格式化日志信息

获取日志记录器:logging.getlogger(__name__)获取一个日志记录器对象,name为当前模块的名称,通过不同文件名称来区分日志,有助于在大型项目中区分不同模块日志
设置日志级别:logger.setlevel()将日志记录器设置级别,当高于或者等于这个级别的日志就会记录

创建文件处理器:logging.fileHandler(filename="文件名")创建文件处理器,把日志信息写入到这个文件中
添加文件处理器:logger.addHandler(handler)将文件处理器添加到日志记录器中

生成测试报告allure


Allure Report由一个框架适配器和allure命令行工具组成,是一个开源工具,用于可视化的查看运行结果(测试报告)
还是需要我们手动的去下载

下载链接: https://github.com/allure-framework/allure2/releases/download/2.30.0/allure-2.30.0.zip
下载后 我们如果想在pycharm中使用,我们需要配置环境变量
找到对应bin文件,然后找到电脑的环境变量

注:allure是一个基于Java的工具,所以我们需要先配置java环境变量,步骤一样的
配置好后,如果我们想验证一下,我们可以使用allure --version

若出现我们在cmd中可以用上述命令打印版本,但是pycharm控制台提示找不到,则需要我们手动修改pycharm命令环境

保存后重启pycharm即可

安装好后,我们来看他的使用
首先我们要运行自动化,并指定测试报告的放置路径

pytest --alluredir=results_dir


此时我们测试报告就已经生成了。那么如何查看测试报告呢?

方法1:
 

 allure serve 生成的测试文件地址

这个测试文件地址,可以是相对地址也可以是绝对地址(绝对地址要加“”,相对不用加)这边建议写绝对地址,不容易错
 我们也可以指定端口号 
 

allure serve --port 8787 .\allure-results\

还有清除上一次生成的测试报告
 

allure serve .\allure-results\ --clean-alluredir

执行后,就会给我们跳出Web版的测试报告

但是通过这样生成的测试报告,当我们关闭网站 ctrl+c后就会关闭无法再次打开,所以我们可以选择使用持续集成(CI)工具,或者本地持续运行的服务器或者我们生成静态的测试报告
通过
 

allure generate .\allure-results\ -o .\allure-report
--clean

allure generate是用来生成我们的测试报告
.\allure-results\`:这是测试结果所在的目录。
-o --clean:这个选项表示在生成新报告之前,先清理输出目录(即.\allure-report)。.\allure-report-o--output的缩写,用于指定生成的HTML报告的输出目录。

http://www.dtcms.com/a/326781.html

相关文章:

  • 深入了解torch框架
  • 数据类型 string
  • 算法题——IP地址分类与子网掩码
  • CobaltStrike安装和使用教程
  • Cobalt Strike的搭建和使用
  • JDK21虚拟线程和 Golang1.24协程的比较
  • STM32——system文件夹
  • Empire--安装、使用
  • 集团型企业如何统一管控子公司权限?
  • 奈飞工厂:算法优化实战​
  • 视频播放器哪个好用?视频播放器PotPlayer,KMP Player
  • 多轮会话记忆的核心挑战
  • 8.11下一代防火墙组网方案笔记
  • 使用MAS(Microsoft Activation Scripts)永久获得win10专业版和office全套
  • C++算法·前缀和
  • DCN之AP IGMP Snooping 原理与配置
  • P3917 异或序列 题解
  • Day01_QT编程20250811
  • while循环结合列表或字典
  • 二叉搜索树解析与实现
  • 快速设计简单嵌入式操作系统(3):动手实操,基于STC8编写单任务执行程序,感悟MCU指令的执行过程
  • USB 标准请求
  • 机器学习——KMeans聚类实战案例解析
  • git配置proxy
  • Docker-09.Docker基础-Dockerfile语法
  • Docker中部署安装MySQL 5.7.32的详细过程
  • Rust面试题及详细答案120道(19-26)-- 所有权与借用
  • PTE之路--04文
  • java面试题准备
  • 【k近邻】Kd树的构造与最近邻搜索算法