(一)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.pswp.cn/pingmian/92634.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92634.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/92634.shtml

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

相关文章

算法训练营day46 647. 回文子串、516.最长回文子序列、动态规划总结篇

今天是动态规划的最后一篇内容了&#xff0c;本篇主要是针对回文字符串这种“与众不同”的递推规律来进行讲解 647. 回文子串 统计并返回这个字符串中 回文子串 的数目 暴力解法 两层for循环&#xff0c;遍历区间起始位置和终止位置&#xff0c;然后还需要一层遍历判断这个区…

Qt界面优化

1.QSS在网页前端开发领域中&#xff0c;CSS 是一个至关重要的部分&#xff0c;描述了一个网页的 “样式”&#xff0c;从而起到对网页美化的作用。所谓样式&#xff0c;包括不限于大小、位置、颜色、背景、间距、字体等等。网页开发作为 GUI 的典型代表&#xff0c;也对于其他客…

week1+2+3

408 计组 1.基本组成2.数据的表示和运算定点数&#xff1a;把数字分为定点整数和定点小数分开存储 浮点数&#xff1a;用科学计数法存储 原码 -全部取反-> 反码 反码 1->补码 补码 -符号位取反->移码带余除法&#xff1a;设x,m∈Z&#xff0c;m>0则存在唯一的整数q…

java8中javafx包缺少报错

今天拉取一个jdk1.8的项目里面有一个代码用到了javafx&#xff0c;这个我记得是jdk中的包&#xff0c;正常不应该报错的。然后发现jdk中还真没有&#xff0c;查了一下是因为版本问题。 Java 8 及之前&#xff1a;Oracle JDK 自带 JavaFX&#xff0c;OpenJDK 通常不包含Java 9 …

day072-代码检查工具-Sonar与maven私服-Nexus

文章目录0. 老男孩思想-选对池塘钓美人鱼1. 代码回滚方案2. SonarQube2.1 代码检查工具2.2 部署sonarqube2.2.1 软件要求2.2.2 安装软件2.2.3 启动sonar2.2.4 部署插件2.3 sonar检查java代码2.3.1 创建sona项目2.3.2 分析java代码2.3.3 Jenkins结合sonar检查代码2.4 sonar检查非…

【前端基础】15、列表元素、表格元素、表单元素(注:极其粗略的记载。)

一、列表元素 1、什么是列表元素2、有序列表&#xff08;ol、li&#xff09; ol有序列表 直接子元素只能是li。 li列表中的每一项。3、无序列表&#xff08;ul、li&#xff09; ol无序列表 直接子元素只能是li。 li列表中的每一项。4、定义列表&#xff08;dl、dt、dd&#xff…

IRFBG30PBF Vishay威世MOSFET场效应管

IRFBG30PBF Vishay威世&#xff1a;超快MOSFET 场效应管一、产品定位IRFBG30PBF 是Vishay威世推出的600V/30A N沟道功率MOSFET&#xff0c;采用第五代TrenchFET技术&#xff0c;专为开关电源、电机驱动、新能源逆变器等高功率场景设计。以85mΩ超低导通电阻和超快反向恢复&…

【07-AGI的讨论】

AI ANI&#xff1a;artificial narrow intelligence; 如 智能音箱&#xff1b;自动驾驶汽车&#xff0c;网络搜索&#xff0c;其他用于专业特定事项的工具&#xff1b; AGI&#xff1a;artificial general intelligence; building AI systems that could do anything a typical…

[激光原理与应用-225]:机械 - 3D图与2D图各自的作用

在机械设计与加工领域&#xff0c;3D图和2D图是两种核心的工程表达方式&#xff0c;它们在产品设计、制造、装配及维护等环节中扮演不同角色&#xff0c;具有互补性。以下是它们各自的作用及具体应用场景的详细解析&#xff1a;一、3D图的作用1. 直观展示产品全貌三维可视化&am…

【从零开始java学习|第一篇】java中的名词概念(JDK、JVM、JRE等等)

目录 一、核心运行环境三要素&#xff08;JVM/JRE/JDK&#xff09; 二、常用开发指令&#xff08;JDK 自带工具&#xff09; 三、一些其他概念 四、总结核心逻辑链 要入门 Java&#xff0c;理解核心概念之间的关系是基础。以下是 Java 中最核心的基础概念、工具及相关名词的…

UVa12345 Dynamic len(set(a[L:R]))

[TOC](UVa12345 Dynamic len(set(a[L:R]))) 题目链接 UVA - 12345 Dynamic len(set(a[L:R])) 题意 有编号从 0 到 n−1 的 n 个数&#xff0c;有两种操作&#xff1a; Q L R 询问编号 L 到编号 R−1 的数中有多少个不同的数字。M X Y 将编号为 X 的数字改为 Y。 你的任务就是…

[Ubuntu] VNC连接Linux云服务器 | 实现GNOME图形化

将桌面环境修改为 GNOME 并通过 VNC 远程访问的步骤 & TightVNC 的安装与配置说明&#xff1a;1. 安装 GNOME 桌面环境 sudo apt update sudo apt install ubuntu-gnome-desktop -y2. 安装 TightVNC 服务器 sudo apt install tightvncserver -y3. 初始化 VNC Server 并设置…

进程、网络通信方法

一、进程间通信(IPC)方法 适用于同一台主机上的进程间数据交换。 管道(Pipe) 匿名管道:单向通信,仅用于父子进程。 命名管道(FIFO):通过文件系统路径访问,支持无亲缘关系进程。 消息队列(Message Queue) 结构化消息(类型+数据),按类型读取,支持异步通信。…

[激光原理与应用-241]:设计 - 266n皮秒深紫外激光器,哪些因素影响激光器紫外光的输出功率?

一、短期稳定性266nm皮秒深紫外激光器紫外光输出功率的稳定性受非线性晶体性能、光学系统设计、热管理效果、重复频率与脉冲能量匹配度、环境干扰控制等因素影响&#xff0c;具体分析如下&#xff1a;1. 非线性晶体性能晶体选择与状态&#xff1a;BBO&#xff08;偏硼酸钡&…

Django配置sqllite之外的数据库

当连接到其他数据库后端时&#xff0c;如 MariaDB、MySQL、Oracle 或 PostgreSQL&#xff0c;将需要额外的连接参数。请参阅下面的 ENGINE 配置&#xff0c;了解如何指定其他数据库类型。这个例子是针对 PostgreSQL&#xff1a; 在django项目的settings.py文件里&#xff0c;关…

银河通用招人形机器人强化学习算法工程师了

人形强化学习算法工程师&#xff08;26届&#xff09;&#xff08;岗位信息已通过jobleap.cn授权&#xff0c;可在csdn发布&#xff09;银河通用机器人 北京收录时间&#xff1a; 2025年08月11日职位描述1. 研发基于深度强化学习的足式机器人运动控制算法&#xff0c;提升机器…

使用MongoDB存储和计算距离

一、MongoDB 计算距离的优势 优势说明原生地理空间索引支持 2dsphere 索引&#xff0c;高效处理地理坐标查询&#xff08;毫秒级响应&#xff09;。内置地理计算函数提供 $near、$geoWithin、$geoNear 等操作符&#xff0c;无需手动实现复杂计算。高性能基于B树索引优化&#…

鸿蒙开发-ArkUI中@Type作用详细解答

在鸿蒙&#xff08;HarmonyOS&#xff09;应用开发中&#xff0c;Type 是 ArkUI 框架中用于 类型定义和类型检查 的关键注解&#xff08;装饰器&#xff09;。它的主要作用是为自定义组件的属性提供明确的类型约束&#xff0c;确保数据传递的类型安全性。 核心作用解析&#xf…

MCU中的存储器映射(Memory Map)

MCU中的存储器映射(Memory Map) 在MCU(微控制器单元)中,存储器映射(Memory Map)是指将不同类型的存储器(如Flash、RAM、外设寄存器等)和功能模块分配到统一的地址空间的过程。这种映射方式使得CPU可以通过访问特定地址来读写数据或控制外设,而无需关心物理存储介质的…

Rust面试题及详细答案120道(11-18)-- 控制流与函数

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…