json测试数据需用pathlib构造绝对路径并校验存在性,避免相对路径问题;用get()链式访问或jsonschema校验嵌套结构;按环境变量或pytest参数加载不同文件;大文件用session级fixture缓存或流式解析;须定义schema文档保障数据契约。

JSON 文件路径写错导致测试找不到数据
测试运行时抛出 FileNotFoundError 或空对象,八成是路径没对上。Python 的 open() 和 json.load() 不会自动帮你找文件,当前工作目录(os.getcwd())和测试文件所在目录往往不一致。
- 用
pathlib.Path(__file__).parent / "data" / "user_list.json"构造绝对路径,别拼字符串 - 避免在测试里写
../data/xxx.json—— 相对路径依赖执行位置,CI 环境极易崩 - 加个存在性检查:
assert (Path(__file__).parent / "data" / "user_list.json").exists(),失败时立刻暴露问题
JSON 数据嵌套太深,断言写得又臭又长
直接用 response["data"]["items"][0]["profile"]["email"] 做断言,不仅难读,一旦某层字段缺失就抛 KeyError,还掩盖真实问题。
- 用
dict.get()链式兜底:data.get("data", {}).get("items", [{}])[0].get("profile", {}).get("email") - 更稳的做法:先用
jsonschema.validate()校验整个响应结构,再做业务字段断言 - 如果只是读取固定结构的测试数据(非 API 响应),提前用 Python 类或
dataclass封装,比如User.from_json(raw_dict),把解析逻辑收口
不同环境要加载不同 JSON 文件,硬编码路径根本没法维护
开发用 test_data_dev.json,预发用 test_data_staging.json,手动改文件名?一上线就忘改,测的其实是旧数据。
- 通过环境变量控制:
env = os.getenv("TEST_ENV", "dev"),然后拼f"test_data_{env}.json" - 或者用 pytest 的
--env=staging参数 +pytest_addoption注入,比环境变量更显式、可审计 - 切忌在 JSON 文件里塞环境相关字段(比如
"base_url": "http://localhost:8000")——配置和数据要分离,JSON 只管数据形态
大 JSON 文件拖慢测试启动,但又不能删
一个 5MB 的 products_full_catalog.json 被 20 个测试用例反复 json.load(),光解析就占掉 30% 总耗时。
- 用
@pytest.fixture(scope="session")缓存解析结果,整个测试 session 只读一次 - 如果某些用例只用其中几条记录,别全量加载;改用
jq命令行或ijson流式解析,按需取字段 - 注意:缓存后修改 JSON 文件不会自动重载,调试时记得加
--no-cache或清.pytest_cache
JSON 文件不是“扔进去就行”的静态资源,它和测试代码一样需要明确归属、版本约束和加载契约。最常被忽略的是:没人给测试 JSON 写 schema 文档,结果字段含义靠猜,字段变更没人通知,修 bug 时顺手改了数据格式,连带一堆测试挂掉。











