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

如何结合参数化单元测试与mock,测试依赖外部包的get_case_nom方法

解决方案

你当前写的测试存在逻辑错误:你先手动mock了MorphologyTaggerService实例,指定了get_case_nom方法的返回值,又直接调用mock实例的方法做断言,本质是在测试mock框架本身,完全没有覆盖你自己的业务逻辑,没有实际测试价值。

正确实现思路

  • 遵循mock哪里用就mock哪里的原则:找到你自己的业务代码中引入、使用MorphologyTaggerService的路径,mock该路径下的类,而不是单独实例化mock对象自测
  • 测试目标是你自己封装的、调用了MorphologyTaggerService.get_case_nom的业务方法,不是mock出来的依赖方法
  • 可增加方法调用校验,确保业务代码传参、调用逻辑符合预期

代码示例

假设你的业务代码存放在my_service.py中,逻辑如下:

# my_service.py 业务代码
from 第三方包路径 import MorphologyTaggerService

def get_case_nom(input_str):
    # 你的业务逻辑,调用外部依赖
    mts = MorphologyTaggerService()
    return mts.get_case_nom(input_str)

对应的参数化测试代码如下:

from unittest.mock import patch
from parameterized import parameterized
from assertpy import assert_that
from my_service import get_case_nom

@parameterized.expand([
    ["Petr", "Petr"],
    ["Karlovi", "Karel"],
    ["babičce Martě", "babička Marta"],
    ["jemu", "On"],
    ["ČEZu", "ČEZ"],
])
def test_getCaseNom(input_str, expected_output):
    # Mock业务代码中实际引入的MorphologyTaggerService类
    with patch("my_service.MorphologyTaggerService") as mock_mts_cls:
        # 配置mock实例的get_case_nom方法返回值
        mock_mts = mock_mts_cls.return_value
        mock_mts.get_case_nom.return_value = expected_output

        # 调用你自己的业务方法
        actual = get_case_nom(input_str)

        # 断言结果符合预期
        assert_that(actual).is_equal_to(expected_output)
        # 可选:校验方法调用参数是否正确,避免业务代码传参错误
        mock_mts.get_case_nom.assert_called_once_with(input_str)

注意事项

  • 不要用Python内置关键字input作为测试参数变量名,避免和内置input()函数冲突引发不可预期的错误
  • 如果你用的是pytest框架,也可以直接用@pytest.mark.parametrize实现参数化,写法逻辑一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:06:07