如何结合参数化单元测试与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
相关产品推荐
相关产品推荐

