自动化测试报告中,该如何呈现JSON数据

一. JSON介绍

1. JSON(JavaScript Object Notation)是接口测试中常见的数据格式,它是一种基于轻量级文本的数据交换格式。

2. JSON数据的规则定义

1)JSON字符串必须用双引号编写

2)JSON中并列数据之间用逗号隔开

3)JSON中映射用冒号表示

3. JSON数据有6种数据类型(4简单2复杂)

string类型:字符串类型, e.g: {"name": "chinablue"}
number类型:数字类型, e.g: {"age": 18, "price", 20.19, "coefficient": "-1.1"}
boolean类型:布尔类型, e.g: {"is_open": true, "is_return", false}
null类型:null类型, e.g: {"is_json": null}
array类型:数组类型, e.g: {"data": [1, 2, 3]}
object类型:对象类型, e.g: {"data": {"name": "chinablue", "age": 18}}

二. 将Python中的dict类型数据转为json字符串

思路:使用Python3内置的json库来进行json序列化操作

2.1 json.dumps()的基本使用

示例代码:

# -*- coding: utf-8 -*-
# @Time    : 2021/3/7 14:16
# @Author  : chinablue
# @File    : tmp0307.py

import json

data_dict = {
    "name": "chinablue",
    "age": 18,
    "is_single": True,
    "hobby": ["basketball", "football"],
    "score": {
        "English": (99.8, 100),
        "math": None,
        "语文": (100, 150),
    }
}

# 转换前
print(f"【data_dict】数据类型:{type(data_dict)},数据内容:{data_dict}")
# 转换后
data_json = json.dumps(data_dict)
print(f"【data_json】数据类型:{type(data_json)}, 数据内容:{data_json}")

执行结果:

【data_dict】数据类型:<class 'dict'>,数据内容:{'name': 'chinablue', 'age': 18, 'is_single': True, 'hobby': ['basketball', 'football'], 'score': {'English': (99.8, 100), 'math': None, '语文': (100, 150)}}
【data_json】数据类型:<class 'str'>, 数据内容:{"name": "chinablue", "age": 18, "is_single": true, "hobby": ["basketball", "football"], "score": {"English": [99.8, 100], "math": null, "u8bedu6587": [100, 150]}}

分析说明:

1) 序列化后,python数据类型和json数据类型的映射关系如下:

Python数据类型 JSON数据类型 Python数据类型 JSON数据类型
str string True,False true,false
int,float number list,tuple array
None null dict object

2) 序列化后,json数据中字符串会默认使用双引号,这也是json数据的明确规则

3) 序列化后,中文会默认转换为对应的ASCII编码

2.2 让json.dumps()支持自定义对象的序列化操作

示例代码:

# -*- coding: utf-8 -*-
# @Time    : 2021/3/7 14:16
# @Author  : chinablue
# @File    : tmp0307.py

import json


class Info():
    """这是一个业务信息类"""


data_dict = {
    "name": "chinablue",
    "age": 18,
    "info": Info(),
}

data_json = json.dumps(data_dict)
print(data_json)

执行结果:

TypeError: Object of type 'Info' is not JSON serializable

分析说明:

json.dumps()方法默认情况下不支持自定义类对象的序列化操作,所以会报错

解决思路:

通过实现一个json.JSONEncoder的子类,并重写其default()方法。让json模块来支持更多对象的序列化操作

代码改进:

# -*- coding: utf-8 -*-
# @Time    : 2021/3/7 14:16
# @Author  : chinablue
# @File    : tmp0307.py

import json


class Info():
    """这是一个业务信息类"""

    def __str__(self):
        return rf"这是一个业务信息类"


class MyEncoder(json.JSONEncoder):
    """通过实现一个json.JSONEncoder的子类,并重写其default()方法。让json模块来支持更多对象的序列化操作"""

    def default(self, obj):

        # 如果是字节数据,直接将其转为字符串数据
        if isinstance(obj, bytes):
            return obj.__str__()

        # 如果是自定义类Info的对象,将其转为字符串数据
        elif isinstance(obj, Info):
            return obj.__str__()

        return json.JSONEncoder.default(self, obj)


data_dict = {
    "name": "chinablue",
    "age": 18,
    "info": Info(),
}

data_json = json.dumps(data_dict, cls=MyEncoder, ensure_ascii=False)
print(data_json)

执行结果:

{"name": "chinablue", "age": 18, "info": "这是一个业务信息类"}

三. 自动化测试报告中呈现JSON数据

3.1 需求分析

1. 期望报告中显示的json数据是格式化缩进形式的

data_json = json.dumps(data_dict, indent=4)

2. 期望报告中显示的json数据是按key进行排序的

data_json = json.dumps(data_dict, sort_keys=True)

3. 期望报告中显示的json数据是支持显示中文的 

data_json = json.dumps(data_dict, ensure_ascii=False)

3.2 呈现效果展示

原文地址:https://www.cnblogs.com/reconova-56/p/14495012.html