如何用Pytest ExceptionInfo实现文件存在与访问权限校验测试
Pytest 异常场景测试用例修改实现
原有测试代码存在两个明显问题:
- 逻辑反向:原写法捕获到目标异常就调用
pytest.fail()标记测试失败,和「验证错误场景抛出预期异常」的测试目标完全相反 - 存在拼写错误:
Permission Error应为PermissionError,py test应为pytest
修改思路
使用pytest.raises(期望异常类型)作为上下文管理器,把执行被测方法的代码放在with块内:
- 块内代码抛出指定类型异常时,测试正常通过
- 未抛出异常、或抛出其他类型异常时,测试自动判定失败
- 绑定
as exception_info后,可通过该对象拿到捕获的异常实例,按需校验异常信息等属性
修改后的测试代码
首先在测试文件头部导入依赖:
import pytest import csv import os import stat # 从你的业务模块导入被测方法 from your_module import read_data_from_file
1. 文件不存在场景测试
测试时传入确定不存在的文件路径,不要用可能存在的文件名,避免测试结果不稳定:
def test_read_data_from_file_not_found(): """验证传入不存在的文件路径时,抛出FileNotFoundError""" test_filename = "nonexistent_test_file_98765.csv" with pytest.raises(FileNotFoundError) as exception_info: read_data_from_file(test_filename) # 可选校验:异常信息中包含测试用的文件名 assert test_filename in str(exception_info.value)
2. 无文件访问权限场景测试
不要依赖本地提前创建的固定err.csv文件,用pytest内置的tmp_path临时目录夹具动态构造无权限测试文件,测试完成后自动清理:
def test_read_data_from_file_no_permission(tmp_path): """验证传入无读权限的文件时,抛出PermissionError""" # 创建临时测试文件,写入基础csv内容 test_file = tmp_path / "no_perm_test.csv" test_file.write_text("col1,col2\ntest_val1,test_val2") # 移除文件所有读权限 os.chmod(test_file, stat.S_IWUSR) with pytest.raises(PermissionError) as exception_info: read_data_from_file(str(test_file)) # 恢复文件权限,避免临时目录清理失败 os.chmod(test_file, stat.S_IRUSR | stat.S_IWUSR)
补充说明
你提供的read_data_from_file方法不需要额外修改,Python内置的open()函数在文件不存在、无访问权限时会自动抛出对应类型的异常,天然符合测试的异常抛出预期。
注意:Windows系统的权限控制逻辑和Linux/macOS存在差异,可根据实际运行环境调整无权限文件的构造方式。
内容的提问来源于stack exchange,提问作者user19256692
相关产品推荐
相关产品推荐

