You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 04:33:26