目录
一、日志收集
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 的日志文件。文件的作用是记录系统运行过程中,产生的信息。
- 搜集日志的作用
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代码校验
- 导包 import jsonschema
- 定义 jsonschema格式 数据校验规则
- 调⽤ 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())