如何用pytest mock os.listdir测试双目录文件数量对比函数
实现方案
第一步:修正原函数的错误
你提供的原始函数存在多语法和逻辑问题,先修正为可正常运行的版本:
import os def my_func(dir_1: str, dir_2: str) -> bool: # 获取两个目录下的文件数量 dir_1_count = len(os.listdir(dir_1)) dir_2_count = len(os.listdir(dir_2)) return dir_1_count == dir_2_count
原错误点:缺少函数定义关键字
def、变量名拼写不一致(参数是dir_1/dir_2,内部调用误用dir1/dir2)、未对os.listdir的结果取长度、返回值错误对比了两个目录路径而非文件数量。
第二步:安装依赖
提前安装pytest和配套的mock插件:
pip install pytest pytest-mock
第三步:编写测试用例
测试文件可命名为test_dir_count.py,内容如下:
import os from your_module import my_func # 把your_module替换为你存放my_func的模块名 def test_my_func_equal_count(mocker): # mock os.listdir方法,不会真实操作本地文件系统 mock_listdir = mocker.patch("os.listdir") # 按传入的目录参数返回不同的模拟结果,两个目录均返回3个文件 mock_listdir.side_effect = lambda path: ["a.txt", "b.csv", "c.md"] if path == "test_dir1" else ["1.png", "2.docx", "3.pdf"] # 验证文件数量相等时返回True assert my_func("test_dir1", "test_dir2") is True # 验证mock方法被正确调用 assert mock_listdir.call_count == 2 mock_listdir.assert_any_call("test_dir1") mock_listdir.assert_any_call("test_dir2") def test_my_func_unequal_count(mocker): mock_listdir = mocker.patch("os.listdir") # 第一个目录返回3个文件,第二个返回2个文件 mock_listdir.side_effect = lambda path: ["a.txt", "b.csv", "c.md"] if path == "test_dir1" else ["1.png", "2.docx"] # 验证文件数量不等时返回False assert my_func("test_dir1", "test_dir2") is False
第四步:运行测试
在终端执行以下命令即可运行测试:
pytest test_dir_count.py -v
补充说明
- 如果需要测试更多场景,比如目录不存在的异常处理,可以自行扩展
side_effect的逻辑,或者设置mock_listdir.side_effect = FileNotFoundError模拟目录不存在的情况。
内容的提问来源于stack exchange,提问作者Hamza Shafiq
相关产品推荐
相关产品推荐

