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()

关键点:

  1. 直接传递方法引用@parameterized.expand(get_test_data) 注意没有括号,这样装饰器会在运行时调用该方法
  2. 使用lambda延迟执行:当需要访问实例属性或调用其他实例方法时,用lambda包装:lambda self: [...]
  3. 外部函数:也可以使用模块级别的函数生成数据

执行方式:

python -m unittest test_module.py
# 或
python test_module.py

总结: 传递方法引用而不是调用结果,用lambda处理实例依赖。


没有人知道吗?

回到顶部