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

如何在Python unittest中合并含默认参数的函数测试用例?

可以合并,两种实现方式

方法一:直接加入默认参数等价场景

如果get_user中adults_only=False的显式传入和默认不传参数的行为完全一致(绝大多数场景都是如此),只需把默认场景加入参数化列表即可,还可以给测试用例加名称后缀方便区分:

from parameterized import parameterized
import unittest

def get_user(user_id, adults_only=False):
    # 示例实现,仅作测试用
    if adults_only:
        return "none"
    return "child"

class TestGetUser(unittest.TestCase):
    def setUp(self):
        self.child = type('Child', (), {'id': 123})()

    @parameterized.expand([
        (True, "none"),
        (False, "child"),
        # 测试默认参数场景,显式传False等价于不传参数
        (False, "child", "default_parameter")
    ])
    def test_get_child(self, adults_only, expected):
        child = self.child
        actual = get_user(child.id, adults_only=adults_only)
        assert expected == actual

方法二:区分显式传参和默认参数场景

如果函数内部逻辑会区分“显式传入False”和“使用默认参数”(比如通过inspect模块检查参数是否被显式传递),可以用特殊标记(比如None)来分支处理调用方式:

from parameterized import parameterized
import unittest

def get_user(user_id, adults_only=False):
    # 示例实现,区分显式传参和默认参数
    import inspect
    frame = inspect.currentframe()
    args, _, _, values = inspect.getargvalues(frame)
    # 检查adults_only是否被显式传入
    if 'adults_only' in frame.f_code.co_varnames[:frame.f_code.co_argcount] and values['adults_only'] is not frame.f_locals.get('adults_only'):
        # 这里是模拟区分逻辑,实际根据需求调整
        return "explicit_false" if not values['adults_only'] else "none"
    return "child"

class TestGetUser(unittest.TestCase):
    def setUp(self):
        self.child = type('Child', (), {'id': 123})()

    @parameterized.expand([
        (True, "none"),
        (False, "explicit_false"),
        (None, "child")  # None标记表示使用默认参数,不传该参数
    ])
    def test_get_child(self, adults_only_arg, expected):
        child = self.child
        if adults_only_arg is None:
            # 调用时不传adults_only,使用默认值
            actual = get_user(child.id)
        else:
            actual = get_user(child.id, adults_only=adults_only_arg)
        assert expected == actual

注意点

  • 修正了你代码中的拼写错误:paramaterized → parameterized
  • 参数化列表的第三个元素会作为测试用例的名称后缀,运行时能看到具体是哪个场景的测试,便于排查问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:34:58