如何在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
相关产品推荐
相关产品推荐

