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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:54:03