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

目录

一、日志收集

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())
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
PyCharm是一款Python集成开发环境(IDE),能够提供丰富的功能来帮助开发者进行接口测试。在PyCharm中进行接口测试可以按照以下步骤进行: 1. 配置接口测试环境:根据需要选择相应的接口测试环境,例如mock、dev、test等,在配置文件中设置对应的环境参数,如host、port等。这样测试代码就会测试对应环境的接口。 2. 学习接口测试相关知识:可以加入Python接口测试的QQ交流群,与其他开发者进行交流和学习。此外,还可以参加相关的实战课程,如提供的课程链接所示,来深入了解和学习接口测试的实践技巧。 3. 运行测试代码并查看结果:在PyCharm中编写接口测试代码,并运行代码进行测试。测试结果会在编译器的控制台中显示,可以根据结果判断接口是否通过。此外,还可以生成HTML报告文件,报告文件会存放在test_reports文件夹中,方便查看和分析测试结果。 4. 提取测试结果数据:可以通过推送数据和报告链接的方式,将测试结果数据提取出来。这可以通过配置json文件中的report_file值来实现。此外,可以使用suites.json配置文件和结合jenkins任务来灵活指定测试集、推送人员等参数。这些步骤都可以在runner.py中实现。 总之,PyCharm提供了强大的功能和工具来支持接口测试,包括配置环境、编写测试代码、运行测试、生成报告以及提取测试结果数据等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心上学事上练

感谢您的支持,让我们一起成长

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值