这里写目录标题
-
-
- [1. 核心作用:安全地获取JSON字段](#1. 核心作用:安全地获取JSON字段)
- [2. 对比:有 get 和没 get 的天壤之别](#2. 对比:有 get 和没 get 的天壤之别)
- [3. 在接口测试中的典型场景](#3. 在接口测试中的典型场景)
- [4. 与 `resp.json()'key'` 的选择原则](#4. 与
resp.json()['key']的选择原则)
-
你问的 resp.json().get() 是 接口自动化中解析返回数据 的核心操作,它比直接使用 resp.json()['key'] 更安全、更专业。
1. 核心作用:安全地获取JSON字段
resp.json():将接口返回的JSON字符串解析为Python字典或列表。.get('key'):是Python字典的安全取值方法。- 两者结合 :
resp.json().get('field')的意思就是"从返回的JSON中获取指定字段的值,如果该字段不存在,返回 None 而不是报错"。
2. 对比:有 get 和没 get 的天壤之别
假设接口返回的JSON是 {"name": "Tester"}:
❌ 直接使用中括号(不安全)
python
data = resp.json()
name = data['name'] # 正常返回 'Tester'
age = data['age'] # ❌ KeyError! 因为 'age' 不存在,脚本直接崩溃
✅ 使用 .get()(安全)
python
data = resp.json()
name = data.get('name') # 返回 'Tester'
age = data.get('age') # 返回 None,脚本继续运行,不会崩溃
# 还可以设置默认值,让代码更健壮
age = data.get('age', 25) # 如果 'age' 不存在,默认返回 25
3. 在接口测试中的典型场景
场景一:处理可选字段
很多接口的返回字段不是固定的。比如"查询用户信息",VIP用户会多返回一个 vip_level 字段。用 .get() 可以优雅地处理这种情况:
python
user_info = resp.json()
vip_level = user_info.get('vip_level', 0) # 非VIP默认0
print(f"VIP等级: {vip_level}")
场景二:链式取值(嵌套JSON)
当返回的JSON嵌套很深时,配合.get()可以避免因中间层级缺失而报错:
python
# 返回数据: {"data": {"user": {"name": "Tester"}}}
# 安全获取姓名,如果任何一层缺失,返回 None
name = resp.json().get('data', {}).get('user', {}).get('name')
场景三:验证接口返回的关键字段
在断言前,先安全地取出要验证的字段:
python
# 登录接口,验证 token
token = resp.json().get('token')
assert token is not None, "登录失败,未返回token"
4. 与 resp.json()['key'] 的选择原则
| 场景 | 推荐方式 | 原因 |
|---|---|---|
| 验证必需字段(如登录后必须有token) | resp.json()['token'] |
如果字段缺失,让用例快速失败,暴露问题更明显。 |
| 获取可选字段(如用户的中文名) | resp.json().get('cn_name') |
避免因字段缺失导致整个测试用例报错,影响其他断言。 |
| 链式取深层字段 | .get('a', {}).get('b') |
安全,避免 KeyError。 |
总之,resp.json().get() 是你应对不确定返回数据的"安全气囊",掌握它能让你的测试脚本更健壮、更专业。如果还有关于JSON解析或断言的问题,随时可以问我。😊