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

如何在pytest fixture中Mock系统功能并验证调用参数与返回值?

用pytest Mock系统级依赖测试Scene类

先看要测试的Scene类示例

假设你的Scene类实现如下(包含系统命令、目录创建、HTTP请求三个核心操作):

import os
from pathlib import Path
import requests

class Scene:
    def create_directory(self, dir_path: str):
        Path(dir_path).mkdir(parents=True, exist_ok=True)
    
    def run_system_command(self, cmd: str):
        return os.system(cmd)
    
    def fetch_data(self, url: str):
        response = requests.get(url)
        response.raise_for_status()
        return response.json()

测试步骤

1. 安装必要依赖

先装pytest和pytest-mock(后者简化Mock操作):

pip install pytest pytest-mock

2. 编写测试用例

新建test_scene.py文件,逐个测试Scene的方法:

from scene import Scene

def test_create_directory(mocker):
    # Mock Scene类里用到的Path.mkdir方法
    mock_mkdir = mocker.patch("scene.Path.mkdir")
    
    scene = Scene()
    scene.create_directory("/test/path")
    
    # 验证mkdir被调用了一次,且参数完全符合预期
    mock_mkdir.assert_called_once_with(parents=True, exist_ok=True)

def test_run_system_command(mocker):
    # Mock os.system,指定它返回0(模拟命令执行成功)
    mock_system = mocker.patch("scene.os.system", return_value=0)
    
    scene = Scene()
    result = scene.run_system_command("echo hello")
    
    # 验证命令被正确传入,且返回值符合预期
    mock_system.assert_called_once_with("echo hello")
    assert result == 0

def test_fetch_data(mocker):
    # 先Mock requests.get的返回对象
    mock_response = mocker.Mock()
    mock_response.json.return_value = {"key": "value"}
    mock_response.raise_for_status.return_value = None
    # 再Mock requests.get方法,让它返回上面的Mock对象
    mock_get = mocker.patch("scene.requests.get", return_value=mock_response)
    
    scene = Scene()
    data = scene.fetch_data("https://example.com/api")
    
    # 验证整个调用链:请求发对了URL、调用了状态检查、解析了JSON
    mock_get.assert_called_once_with("https://example.com/api")
    mock_response.raise_for_status.assert_called_once()
    mock_response.json.assert_called_once()
    # 验证返回的JSON数据正确
    assert data == {"key": "value"}

关键注意点

  • Mock路径要精准:必须Mock被测试代码(scene模块)里实际引用的依赖路径,比如scene.Path而不是pathlib.Path,不然Mock不会生效。
  • 链式调用的Mock技巧:像requests这种返回对象后还要调用方法的,得先Mock返回的Response对象,再给它的方法设置返回值,才能完整验证整个流程。
  • 参数与返回值双验证:既要确认方法被传入了正确的参数,也要验证返回值符合业务逻辑预期,确保代码的行为完全正确。

内容的提问来源于stack exchange,提问作者nickponline

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:42:15