Python中unittest的parameterized装饰器如何传递其他方法的返回值?
伪代码 ,只帖了关键部分
class test(unittest.TestCase):
def tobase64(self, img):
with open(img, “rb”) as f:
base64_img = base64.b64encode(f.read())
baseimg = str(base64_img).split("’")[1]
return baseimg
@parameterized.expand([(’’, ‘’, ‘’, ‘200’),
(’’, ‘123’, ‘’, ‘200’),
(self.tobase64(img), str(uuid.uuid4()), 0, 000)])
def test_case1(self):
pass
报错如下:
File "E:\intellif\shijuPK\sjpk.py", line 41, in PK
(self.tobase64(img), str(uuid.uuid4()), 0, 000)])
NameError: name 'self' is not defined
Python中unittest的parameterized装饰器如何传递其他方法的返回值?
3 回复
import unittest
from parameterized import parameterized
class TestCalculator(unittest.TestCase):
# 辅助方法:生成测试数据
def get_test_data(self):
return [
(2, 3, 5),
(5, 7, 12),
(-1, 1, 0)
]
# 辅助方法:获取动态配置
def get_config_value(self):
# 这里可以是数据库查询、文件读取等动态操作
return 10
@parameterized.expand(get_test_data) # 注意:传递的是方法引用,不是调用结果
def test_addition(self, a, b, expected):
"""测试加法:使用类方法生成测试数据"""
result = a + b
self.assertEqual(result, expected)
# 方法2:使用lambda包装
@parameterized.expand(
lambda: [(i, i*2) for i in range(3)] # lambda延迟执行
)
def test_with_lambda(self, input_val, expected):
self.assertEqual(input_val * 2, expected)
# 方法3:在类外部定义数据生成函数
@parameterized.expand(
lambda self: [(self.get_config_value(), i) for i in [1, 2, 3]]
)
def test_with_dynamic_config(self, config_val, multiplier):
result = config_val * multiplier
self.assertTrue(result > 0)
def external_data_generator():
"""外部数据生成函数"""
return [("case1", 10), ("case2", 20)]
class TestExternalData(unittest.TestCase):
@parameterized.expand(external_data_generator)
def test_external(self, case_name, value):
self.assertIsInstance(case_name, str)
self.assertGreater(value, 0)
if __name__ == "__main__":
unittest.main()
关键点:
- 直接传递方法引用:
@parameterized.expand(get_test_data)注意没有括号,这样装饰器会在运行时调用该方法 - 使用lambda延迟执行:当需要访问实例属性或调用其他实例方法时,用lambda包装:
lambda self: [...] - 外部函数:也可以使用模块级别的函数生成数据
执行方式:
python -m unittest test_module.py
# 或
python test_module.py
总结: 传递方法引用而不是调用结果,用lambda处理实例依赖。
没有人知道吗?
挖坟

