接口测试(八)—— 日志收集、全量字段校验、JSON Schema语法

news2024/11/16 14:22:20

目录

一、日志收集

1、日志简介

2、日志的级别

3、日志代码实现分析

4、日志使用

二、全量字段校验

1、简介和安装

2、JSON Schema⼊⻔

2.1 入门案例

2.2 校验方式

3、JSON Schema语法

3.1 type关键字

3.2 properties关键字

3.3 required关键字

3.4 const关键字

3.5 pattern关键字

3.6 综合案例应用

三、IHRM实战

1、使用全量字段校验

2、日志的使用

3、构造员工id



一、日志收集

1、日志简介

  • 什么是日志
    • 日志也叫 log,通常对应的 xxx.log 的日志文件。文件的作用是记录系统运行过程中,产生的信息。
  • 搜集日志的作用
    • 查看系统运行是否正常。
    • 分析、定位 bug

2、日志的级别

  • logging.DEBUG:调试级别【高】
  • logging.INFO:信息级别【次高】
  • logging.WARNING:警告级别【中】
  • logging.ERROR:错误级别【低】
  • logging.CRITICAL:严重错误级别【极低】

 特性:

  • 日志级别设定后,只有比该级别低的日志会写入日志。
    • 如:设定日志级别为 info。 debug 级别的日志信息,不会写入。infowarning、error、critical 会写入

3、日志代码实现分析

日志代码,无需手写实现。会修改、调用即可!

代码分析

"""
步骤:
# 0. 导包
# 1. 创建日志器对象
# 2. 设置日志打印级别
    # logging.DEBUG 调试级别
    # logging.INFO 信息级别
    # logging.WARNING 警告级别
    # logging.ERROR 错误级别
    # logging.CRITICAL 严重错误级别
# 3. 创建处理器对象
    # 创建 输出到控制台 处理器对象
    # 创建 输出到日志文件 处理器对象
# 4. 创建日志信息格式
# 5. 将日志信息格式设置给处理器
    # 设置给 控制台处理器
    # 设置给 日志文件处理器
# 6. 给日志器添加处理器
    # 给日志对象 添加 控制台处理器
    # 给日志对象 添加 日志文件处理器
# 7. 打印日志
"""

import logging.handlers
import logging
import time

# 1. 创建日志器对象
logger = logging.getLogger()

# 2. 设置日志打印级别
logger.setLevel(logging.DEBUG)
# logging.DEBUG 调试级别
# logging.INFO 信息级别
# logging.WARNING 警告级别
# logging.ERROR 错误级别
# logging.CRITICAL 严重错误级别

# 3.1 创建 输出到控制台 处理器对象
st = logging.StreamHandler()
# 3.2 创建 输出到日志文件 处理器对象
fh = logging.handlers.TimedRotatingFileHandler('a.log', when='midnight', interval=1,
backupCount=3, encoding='utf-8')
# when 字符串,指定日志切分间隔时间的单位。midnight:凌晨:12点。
# interval 是间隔时间单位的个数,指等待多少个 when 后继续进行日志记录
# backupCount 是保留日志文件的个数

# 4. 创建日志信息格式
fmt = "%(asctime)s %(levelname)s [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s"
formatter = logging.Formatter(fmt)

# 5.1 日志信息格式 设置给 控制台处理器
st.setFormatter(formatter)
# 5.2 日志信息格式 设置给 日志文件处理器
fh.setFormatter(formatter)

# 6.1 给日志器对象 添加 控制台处理器
logger.addHandler(st)
# 6.2 给日志器对象 添加 日志文件处理器
logger.addHandler(fh)

# 7. 打印日志
while True:
    # logging.debug('我是一个调试级别的日志')
    # logging.info('我是一个信息级别的日志')
    logging.warning('test log sh-26')
    # logging.error('我是一个错误级别的日志')
    # logging.critical('我是一个严重错误级别的日志')
    time.sleep(1)

4、日志使用

可修改的位置

使用步骤:
1. 调用 init_log_config() 函数,初始化日志信息。
2. 指定 日志级别,打印 日志信息。         
 源码文件下载:https://download.csdn.net/download/u010217055/87313711

二、全量字段校验

1、简介和安装

  • 概念:校验接⼝返回响应结果的全部字段(更进一步的断言)
  • 校验内容:
    • 字段值
    • 字段名 或 字段类型
  • 校验流程:
    • 定义json语法校验格式
    • ⽐对接口实际响应数据是否符合json校验格式
  • 安装jsonschema:
pip install jsonschema -i https://pypi.douban.com/simple/
  • 查验:
    • pip 查验:pip list 或 pip show jsonschema
    • pycharm 中 查验:file --- settings --- 项目名中查看 python解释器列表。 

2、JSON Schema⼊⻔

2.1 入门案例

{
    "type": "object",
    "properties": {
    "success": {"type": "boolean"},
    "code": {"type": "integer"},
    "message": {"type": "string"}
    },
    "required": ["success", "code", "message"]
}

2.2 校验方式

在线工具校验

http://json-schema-validator.herokuapp.com
https://www.jsonschemavalidator.net 【推荐】

python代码校验

  • 实现步骤:
  1. 导包 import jsonschema
  2. 定义 jsonschema格式 数据校验规则
  3. 调⽤ jsonschema.validate(instance="json数据", schema="jsonshema规则")
  • 查验校验结果
    • 校验通过:返回 None
    • 校验失败
      • schema 规则错误,返回 SchemaError
      • json 数据错误,返回 ValidationError
  • 案例:
    # 1. 导包
    import jsonschema
    
    # 2. 创建 校验规则
    schema = {
        "type": "object",
        "properties": {
            "success": {
                "type": "boolean"
            },
            "code": {
                "type": "int"
            },
            "message": {
            "type": "string"
            }
        },
        "required": ["success", "code", "message"]
    } 
    
    # 准备待校验数据
    data = {
        "success": True,
        "code": 10000,
        "message": "操作成功"
    }
    
    # 3. 调用 validate 方法,实现校验
    result = jsonschema.validate(instance=data, schema=schema)
    print("result =", result)
    
    # None: 代表校验通过
    # ValidationError:数据 与 校验规则不符
    # SchemaError: 校验规则 语法有误

3、JSON Schema语法

3.1 type关键字

作用:约束数据类型

integer —— 整数
string —— 字符串
object —— 对象
array —— 数组 --> python:list 列表
number —— 整数/⼩数
null —— 空值 --> python:None
boolean —— 布尔值

语法:
{
    "type": "数据类型"
}

示例

import jsonschema

# 准备校验规则
schema = {
    "type": "object"     # 注意 type 和 后面的 类型,都要放到 ”“ 中!
} 

# 准备数据
data = {"a": 1, "b": 2}

# 调用函数
res = jsonschema.validate(instance=data, schema=schema)
print(res)

3.2 properties关键字

说明:是 type关键字的辅助。用于 type 的值为 object 的场景
作用:指定 对象中 每个字段的校验规则。 可以嵌套使用。

语法:
{
    "type": "object",
    "properties":{
        "字段名1":{规则},
        "字段名2":{规则},
        ......
    }
}

 案例1:

{
    "success": true,
    "code": 10000,
    "message": "操作成功",
    "money": 6.66,
    "address": null,
    "data": {
        "name": "tom"
    },
    "luckyNumber": [6, 8, 9]
}
import jsonschema

# 准备校验规则
schema = {
    "type": "object",
    "properties": {
        "success": {"type": "boolean"},
        "code": {"type:": "integer"},
        "message": {"type": "string"},
        "money": {"type": "number"},
        "address": {"type": "null"},
        "data": {"type": "object"},
        "luckyNumber": {"type": "array"}
    }
} 

# 准备测试数据
data = {
    "success": True,
    "code": 10000,
    "message": "操作成功",
    "money": 6.66,
    "address": None,
    "data": {
        "name": "tom"
    },
    "luckyNumber": [6, 8, 9]
} 

# 调用方法进行校验
res = jsonschema.validate(instance=data, schema=schema)
print(res)

案例2:要求定义JSON对象中包含的所有字段及数据类型

data = {
    "success": True,
    "code": 10000,
    "message": "操作成功",
    "money": 6.66,
    "address": None,
    "data": {
        "name": "tom",
        "age": 18,
        "height": 1.78
    },
    "luckyNumber": [6, 8, 9]
}
import jsonschema

# 准备校验规则
schema = {
    "type": "object",
    "properties": {
        "success": {"type": "boolean"},
        "code": {"type:": "integer"},
        "message": {"type": "string"},
        "money": {"type": "number"},
        "address": {"type": "null"},
        "data": {
            "type": "object",
            "properties": { # 对 data 的对象值,进一步进行校验
            "name": {"type": "string"},
            "age": {"type": "integer"},
            "height": {"type": "number"}
        }
    },
     "luckyNumber": {"type": "array"}
    }
} 

# 准备测试数据
data = {
    "success": True,
    "code": 10000,
    "message": "操作成功",
    "money": 6.66,
    "address": None,
    "data": {
        "name": "tom",
        "age": 18,
        "height": 1.78
    },
    "luckyNumber": [6, 8, 9]
}

# 调用方法进行校验
res = jsonschema.validate(instance=data, schema=schema)
print(res)

3.3 required关键字

作用:校验对象中必须存在的字段。字段名必须是字符串,且唯⼀

语法:
{
    "required": ["字段名1", "字段名2", ...]
}
import jsonschema

# 测试数据
data = {
    "success": True,
    "code": 10000,
    "message": "操作成功",
    "data": None,
} 

# 校验规则
schema = {
    "type": "object",
    "required": ["success", "code", "message", "data"]
} 

# 调用方法校验
res = jsonschema.validate(instance=data, schema=schema)
print(res)

3.4 const关键字

作用:校验字段值是⼀个固定值。

语法:
{
    "字段名":{"const": 具体值}
}
import jsonschema

# 测试数据
data = {
    "success": True,
    "code": 10000,
    "message": "操作成功",
    "data": None,
} 

#校验规则
schema = {
    "type": "object",
    "properties": {
        "success": {"const": True},
        "code": {"const": 10000},
        "message": {"const": "操作成功"},
        "data": {"const": None}
    },
    "required": ["success", "code", "message", "data"]
} 

# 调用方法校验
res = jsonschema.validate(instance=data, schema=schema)
print(res)

3.5 pattern关键字

作用:指定正则表达式,对字符串进行模糊匹配

基础正则举例:
1 包含字符串:hello
2 以字符串开头 ^: ^hello 如:hello,world
3 以字符串结尾 $: hello$ 如:中国,hello
4 匹配[]内任意1个字符[]: [0-9]匹配任意⼀个数字 [a-z]匹任意一个小写字母 [cjfew9823]匹配任意一个
5 匹配指定次数{}: [0-9]{11}匹配11位数字。

匹配 手机号:^[0-9]{11}$

语法:
{
    "字段名":{"pattern": "正则表达式"}
}
import jsonschema

# 测试数据
data = {
    "message": "!jeklff37294操作成功43289hke",
    "mobile": "15900000002"
} 

# 校验规则
schema = {
    "type": "object",
    "properties": {
        "message": {"pattern": "操作成功"},
        "mobile": {"pattern": "^[0-9]{11}$"}
    }
} 

# 调用方法校验
res = jsonschema.validate(instance=data, schema=schema)
print(res)

3.6 综合案例应用

# 测试数据
import jsonschema

data = {
    "success": False,
    "code": 10000,
    "message": "xxx登录成功",
    "data": {
        "age": 20,
        "name": "lily"
    }
} 

# 校验规则
schema = {
    "type": "object",
    "properties": {
        "success": {"type": "boolean"},
        "code": {"type": "integer"},
        "message": {"pattern": "登录成功$"},
        "data": {
            "type": "object",
            "properties": {
                "name": {"const": "lily"},
                "age": {"const": 20}
            },
            "required": ["name", "age"]
        }
    },
    "required": ["success", "code", "message", "data"]
} 

# 调用测试方法
res = jsonschema.validate(instance=data, schema=schema)
print(res)

三、IHRM实战

1、使用全量字段校验

import unittest
import jsonschema
from api.ihrm_login_api import IhrmLoginApi

class TestIhrmLogin(unittest.TestCase):
    # 登录成功
    def test01_login_success(self):
        # 组织请求数据
        json_data = {"mobile": "13800000002", "password": "123456"}
        # 调用自己封装的接口
        resp = IhrmLoginApi.login(json_data)
        print("登录成功:", resp.json())

        # 断言
        # assert_util(self, resp, 200, True, 10000, "操作成功")
        # 断言 校验响应状态码
        self.assertEqual(200, resp.status_code)

        # 使用全量字段校验,替换 断言
        # 校验规则
        schema = {
            "type": "object",
            "properties": {
                "success": {"const": True},
                "code": {"const": 10000},
                "message": {"pattern": "操作成功"},
                "data": {"type": "string"}
            },
            "required":["success", "code", "message", "data"]
        } 
        # 调用jsonschema校验函数
        jsonschema.validate(instance=resp.json(), schema=schema)

2、日志的使用

1. 将 包含 init_log_config() 函数的 日志文件,存放到 项目目录 common/ 下。
2. 在 项目入口文件中, 调用 init_log_config() 函数,指定 日志文件名,及 其他参数。
3. 在 所有 需要打印输出的 ,将 logging.级别() 替换 调用 print 输出!
4. 去 生成的日志文件中,查看日志信息。

3、构造员工id

1. 测试 查询员工接口前(setUp),保证 使用的 员工id 已存在!使用 insert SQL语句 插入一个 员工id
2. 使用这个 员工id,进行查询员工接口测试
3. 测试查询员工接口结束(tearDown)时,删除这个 员工id

import logging
import unittest
from api.ihrm_emp_curd import IhrmEmpCURD
from common.db_util import DBUtil
from common.get_header import get_header

class TestEmpQuery(unittest.TestCase):

    header = None

    @classmethod
    def setUpClass(cls) -> None:
        cls.header = get_header()

    def setUp(self) -> None:
        insert_sql = "insert into bs_user(id, mobile, username) values('11232738248634','13974837801', '随便打打');"        
        DBUtil.uid_db(insert_sql)

    def tearDown(self) -> None:
        delete_sql = "delete from bs_user where id = '11232738248634';"
        DBUtil.uid_db(delete_sql)

    # 测试 查询员工
    def test01_query_emp(self):
        # 使用 数据库 切实存在的 emp_id 传入
        resp = IhrmEmpCURD.query_emp("11232738248634", self.header)
        print("查询员工:", resp.json())

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

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

相关文章

ADI Blackfin DSP处理器-BF533的开发详解61:DSP控制ADXL345三轴加速度传感器-LCD(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度传感器的子卡,插在这个板子上,然后写了一些有意思的应用程序。 代码实现功能…

[C++]类和对象【中】

🥁作者: 华丞臧 📕​​​​专栏:【C】 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎在评论区指出。 推荐一款刷题网站 👉LeetCode 文章目录类的六个…

推荐一个.Net分布式微服务开发框架

在给大家介绍之前,我们一起来看看分布式架构的使用场景与好处。 针对一些互联网系统,大数据、高并发和快速响应,都是系统必须满足的,而单机系统的架构是无法满足这样的需求的,这时候我们就需要用到分布式的架构。 分…

ADI Blackfin DSP处理器-BF533的开发详解60:DSP控制ADXL345三轴加速度传感器-电子水平仪(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度传感器的子卡,插在这个板子上,然后写了一些有意思的应用程序。 代码实现功能…

SpringBoot集成JWT实现Token登录验证

1JWT 1.1 JWT是什么? JSON Web令牌(JWT)是一种开放的标准(RFC 7519),它定义了一种紧凑而独立的方式在各方之间安全地传输信息为JSON对象。该信息可以被验证和信任,因为它是数字签名的。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公开…

全国A级景区数据(12000条)

中华人民共和国旅游景区依据质量等级划分景区级别,共分为五级。其中5A级为中国旅游景区最高等级,代表着中国世界级精品的旅游风景区。 而随着国家旅游管理部门对于A级景区实行“有进有出”的动态管理以来,A级景区的调整越来越常态化,其中不乏4A、5A级景区的调整,这也为A级…

使用 NuGet 快速创建 OpenGL 项目

C 目前还没有一个标准的 C 依赖包管理器,传统上都是手动去下载源码编译(经典的例如 make),或者直接下载预编译好的库文件(例如没有开源的)和头文件。之后在项目里配置对应的头文件路径和库路径。这个过程非…

[附源码]Nodejs计算机毕业设计基于响应式交友网站Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…

蚁巢相遇问题

一 问题描述 有 N 个蚁巢,编号为 1~N 。第 i 个蚁巢的位置是(xi , yi),没有两个蚁巢在同一位置。所有蚂蚁都遵守一些规律: ① 当一只蚂蚁在蚁巣 p 时,它总是移动到离 p 最近的另一个蚁巣,若有多个蚁巣与 …

计算机毕设Python+Vue心理健康网站(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

[leetcode 739] 每日温度

题目链接:https://leetcode.cn/problems/daily-temperatures/ 第一个想法是简单两个 for 循环,但是可能会超时(其实用C不会超时)。 因为最近在做栈的题目,所以想到了最小栈(原来叫作最小栈啊~)…

Rust 从入门到放弃,再入门到贡献 nacos-sdk-rust

Rust 从入门到放弃,再入门到贡献 nacos-sdk-rust Rust 上手难度大?我想是的。从文章标题便可知一二,小编水平有限经历了多次入门,得来的经验之谈。本文不涉及详细的技术剖析,仅表达入门的心路历程,供客官参…

Centos7配置nfs

NFS NFS 就是 Network FileSystem ,此系统可以让不同操作系统、不同主机通过网络彼此分享文件,可以将其视为一个文件服务器。使用NFS可以将远程NFS服务器的分享目录挂载到本地主机上,本地主机访问共享目录就是访问远程的NFS服务器。本地主机被称为客户端…

Nacos 简介与 本地调试环境搭建

目录 1、简介 2、Nacos架构 3、本地调试环境搭建 3.1 源码下载 3.3 单机启动 Nacos 3.4 集群方式启动:基于文件方式 4、Nacos源码模块介绍 5. 约定说明 1、简介 Nacos是Dynamic Naming and Configuration Service的首字母简称 Nacos由阿里巴巴开源&#x…

PyTorch入门

开发环境 ANACONDA 官网:Anaconda | The World’s Most Popular Data Science Platform cmd窗口验证安装成功 CUDA 官网:CUDA Toolkit Archive | NVIDIA Developer 选择匹配pytorch的版本下载安装 命令窗口验证安装成功 PyTorch 官网:…

【JavaSE】泛型

目录 一、泛型概念 二、泛型的语法 1、语法 2、实例化 4、泛型如何编译 5、泛型的上界 6、泛型方法 三、通配符 1、使用场景 2、使用 3、通配符的上下界 一、泛型概念 泛型就是适用于许多许多类型,是在jdk1.5引入的 二、泛型的语法 1、语法 class 类名&l…

Apache Hudi Table Query Types

目录 Table Types​ Query types​​​​​​​ Copy On Write Table Merge On Read ​​​​​​​Table & Query Types | Apache Hudi Hudi表类型定义了如何在DFS上对数据进行索引和布局,以及如何在这样的组织之上实现上述原语和时间线活动&#…

区块链入门的几个基本问题

目录前言比特币区块链区块链大揭秘抛砖引玉故事一故事二总结引人入胜侃侃而谈去中心化开放性不可篡改性相关技术共识机制共识机制的两大核心达成共识的主要过程(产生新区块的过程)工作量如何理解?Hash计算Bits和目标Hash值Merkle Root双花问题…

新手python学什么最吃香?

前言 今天跟大家聊聊Python的几个主要发展和就业方向,给准备学习Python的小伙伴解惑。 “ 我想学Python,但是学完Python后都能干啥?” “ 现在学Python,哪个方向最简单?哪个方向最吃香?” “ …… ” …

LeetCode题解 二叉树(五):226 翻转二叉树;101 对称二叉树;100 相同的树;572 另一个树的子树

226 翻转二叉树 easy 这道题有一段广为人知的传说:曾有人说Homebrew(适用于macOS和Linux的开源软件包管理器)的作者Max Howell,没有在白板上写出这道题目,被Google拒绝了。 至于是不是真的因为没做出来这道题就被拒绝…