Python 3.10:未写测试的store_data.py为何覆盖率达97%?如何测试?
问题分析与解决方案
一、覆盖率异常的原因
你看到的store_data.py高达97%的覆盖率,本质是该模块的代码在pytest运行阶段被间接执行了:
- 你的
cat_functions.py中创建了StorePlayerData和StorePlaythroughData的实例,而pytest在收集测试用例或运行相关测试时,会导入cat_functions.py模块——导入过程中,类实例化的代码会触发__init__方法执行,若实例初始化时还调用了读写JSON的方法(比如启动时读取配置),那对应代码行也会被覆盖。 - 而那些
*queries.py模块既没有被测试用例直接调用,也没有被其他导入的模块触发执行,所以覆盖率保持0%。
二、安全测试JSON读写方法的方案
测试这类文件操作方法完全可行,且不会破坏真实数据,核心是隔离真实文件资源,以下是具体实现思路:
1. 使用临时文件隔离测试
借助Python标准库的tempfile模块创建临时JSON文件,让测试方法仅操作临时文件,测试结束后自动清理:
import tempfile import os import json from src.catday.store_data import StorePlayerData def test_store_player_data_read_write(): # 创建临时JSON文件,delete=False避免with块内自动删除 with tempfile.NamedTemporaryFile(mode='w+', suffix='.json', delete=False) as tmp_file: temp_path = tmp_file.name try: # 初始化实例时传入临时文件路径(若原有类不支持参数,可修改__init__增加默认参数) data_store = StorePlayerData(file_path=temp_path) # 定义测试数据 test_player_data = {"cat_name": "Mittens", "score": 1200} # 测试写入方法 data_store.write_data(test_player_data) # 测试读取方法,断言数据一致性 loaded_data = data_store.read_data() assert loaded_data == test_player_data # 额外断言文件内容是否符合预期 with open(temp_path, 'r') as f: file_content = json.load(f) assert file_content == test_player_data finally: # 手动清理临时文件 os.unlink(temp_path)
2. 依赖注入优化(可选)
如果原有类的文件路径是硬编码的,可以修改类的__init__方法,增加可选的路径参数,默认使用真实路径,测试时传入临时路径:
class StorePlayerData: def __init__(self, file_path=None): # 默认使用真实路径,测试时可替换 self.file_path = file_path or "path/to/real/player_data.json" # 其他初始化逻辑...
3. 断言点参考
不要担心没有断言点,这类方法的可断言场景很多:
- 读取方法:断言返回的数据与预期一致,断言文件不存在时的异常抛出(若有处理逻辑)
- 写入方法:断言文件内容与写入数据一致,断言写入后文件存在,断言权限不足时的异常处理
内容的提问来源于stack exchange,提问作者Jesse C.
相关产品推荐
相关产品推荐

