在Python中,操作JSON数据主要包括序列化(将Python对象转换为JSON格式)和反序列化(将JSON字符串转换回Python对象)。
以下是使用Python内置的json模块进行这些操作的基本示例:
JSON 序列化 (Serialization)
将Python对象转换成JSON字符串:
import json
# 定义一个Python字典或列表等可序列化的对象
data = { "name": "Alice", "age": 30, "hobbies": ["reading", "programming"]}
# 使用 json.dumps() 方法将 Python 对象转为 JSON 字符串
json_string = json.dumps(data)
print(json_string) # 输出:{"name": "Alice", "age": 30, "hobbies": ["reading", "programming"]}
JSON 反序列化 (Deserialization)
将JSON字符串转换成Python对象:
import json# 假设我们有一个 JSON 格式的字符串
json_data = '{"name": "Bob", "age": 35, "hobbies": ["guitar", "travel"] }'
# 使用 json.loads() 方法将 JSON 字符串转为 Python 字典
python_obj = json.loads(json_data)print(python_obj)
# 输出:{'name': 'Bob', 'age': 35, 'hobbies': ['guitar', 'travel']}
# 或者从文件读取 JSON 数据并转换
with open('data.json', 'r') as file:
python_obj_from_file = json.load(file)
print(python_obj_from_file)
注意事项:
JSON仅支持特定的数据类型,如数字、字符串、布尔值、null、数组(对应Python中的列表)和对象(对应Python中的字典)。Python中的一些非标准类型(如None、datetime对象、自定义类实例等)需要通过特殊方式处理才能正确地序列化和反序列化。
json.dumps() 方法接受额外的参数用于控制序列化过程,例如ensure_ascii=False可以输出包含非ASCII字符的JSON字符串,indent用于美化输出,设置缩进。
json.load()和json.loads()在遇到不符合JSON格式的输入时会抛出json.JSONDecodeError异常。
在Python进行接口自动化测试时,操作JSON数据是常见且关键的步骤。通常情况下,我们会使用json模块处理HTTP请求中的JSON内容,并通过requests库发送这些请求到API服务器。以下是一个基本示例,展示如何构建和解析JSON数据以执行接口测试:
发送带有JSON数据的POST请求
import requestsimport json
# 定义要发送的JSON数据
payload = { "username": "testuser", "password": "testpassword", "email": "test@example.com"}
# 将Python字典转换为JSON格式字符串
json_payload = json.dumps(payload)
# 设置请求头信息,告诉服务器我们正在发送JSON数据
headers = {'Content-Type': 'application/json'}
# 发送POST请求
response = requests.post('http://example.com/api/login', data=json_payload, headers=headers)
# 检查响应状态码是否正常
if response.status_code == 200:
# 如果响应成功,将其内容反序列化为Python对象
response_json = response.json()
print(response_json)
else:
print(f"请求失败,状态码:{response.status_code}")
# 根据需要对响应JSON数据进行断言或进一步处理
assert response_json['status'] == 'success'
解析返回的JSON响应
对于从API接收到的JSON响应,可以使用response.json()方法将响应体的内容转化为Python字典或列表以便于进行验证。
数据驱动测试
在数据驱动测试场景中,可以从文件读取多个JSON记录(例如,每行一个JSON对象),然后依次对每个记录执行相同的操作:
with open('test_data.json') as f:
test_cases = json.load(f)
for case in test_cases:
# 调整请求参数并发送请求
response = requests.post('http://example.com/api/endpoint', json=case)
# 针对每个测试用例进行相应的断言
assert_response(response, case)
这里,test_data.json文件可能包含多条记录,每一项都是一个待测试的JSON数据结构。在循环中,逐个发送请求并根据每个用例的结果进行验证。
json在接口自动化里的高级使用
在接口自动化测试中,JSON的高级使用通常涉及到更复杂的数据操作、模式验证以及高效地提取和比较响应数据。以下是一些高级用例:
JsonPath 或 JMESPath 的应用:
使用jsonpath或jmespath库来从复杂的JSON响应中精准提取数据,而无需遍历整个数据结构。
import jsonpath
# or jmespath for JMESPath
response_json = {"users": [{"name": "Alice", "id": 1}, {"name": "Bob", "id": 2}]}
names = jsonpath.jsonpath(response_json, '$.users[*].name') # 返回 ['Alice', 'Bob']
JSON Schema验证:
使用jsonschema库对API返回的JSON响应进行模式匹配验证,确保其符合预定义的结构和约束条件。
from jsonschema import validate, ValidationError
schema = { "type": "object", "properties": { "status": {"type": "string"}, "data": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "name": {"type": "string"}}}} }, "required": ["status", "data"]}
response = {"status": "ok", "data": [{"id": 1, "name": "Alice"}]}
try:
validate(instance=response, schema=schema)
print("Response matches the schema.")
except ValidationError as e:
print(f"Validation error: {e}")
动态构建请求体:
根据需求动态生成或修改JSON请求体,例如基于数据库查询结果构造请求参数。
def build_request_body(user_id):
user_data = get_user_from_database(user_id)
# 假设这是一个获取用户信息的方法
request_body = {"user": {"id": user_data["id"], "name": user_data["name"]}} return request_body
payload = build_request_body(1)
response = requests.post('http://example.com/api/update', json=payload)
批量执行与结果分析:
对于大批量的数据交互,可以将多个JSON请求组织成一个列表,并利用循环或异步方式发送请求,然后汇总所有响应的结果进行整体评估。
错误处理和容错机制:
对接收到的JSON数据进行深度检查,对于非标准格式或异常字段,能够有策略地处理并记录异常。
缓存和复用:
对于一些重复性的数据,如Token或者Header中的JWT,可以将其存储起来并在后续请求中复用,提高效率同时保持安全性。
通过以上这些高级技术,可以在接口自动化测试中更好地管理和操纵JSON数据,提高测试代码的质量和可维护性。
行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!