Python2.7 unittest如何实现C# TestCase式参数化单元测试?
问题解答
Python 2.7环境下完全可以实现类似C#中TestCase属性标注多组测试用例、自定义测试名称的需求,主流实现方案分为两种:
方案1:使用第三方库parameterized(推荐)
该库原生支持unittest框架,兼容Python 2.7,使用方式和C#的TestCase属性非常接近。注意Python 2.7支持的最高parameterized版本为0.8.1,可安装对应版本使用。
import unittest from parameterized import parameterized, param def identity(x): return x class TestNewFunctions(unittest.TestCase): @parameterized.expand([ param(1, 1, name="test-1"), param(2, 2, name="test-2"), param(3, 3, name="test-3"), ]) def test_identity(self, input_val, expected_output): self.assertEqual(identity(input_val), expected_output)
运行后会自动生成三个独立的测试用例,用例名称就是name参数指定的自定义名称,完全符合需求。
方案2:自定义装饰器实现(无第三方依赖)
如果项目不允许安装额外依赖,可以通过自定义装饰器动态生成测试方法,实现相同效果,完全兼容Python 2.7原生语法:
import unittest def identity(x): return x def test_case(*args, **kwargs): def decorator(func): if not hasattr(func, 'test_cases'): func.test_cases = [] func.test_cases.append((args, kwargs)) return func return decorator def generate_test_cases(cls): for name, func in list(cls.__dict__.items()): if hasattr(func, 'test_cases'): for idx, (args, kwargs) in enumerate(func.test_cases): test_name = kwargs.pop('test_name', "%s_%d" % (name, idx+1)) def create_test_method(f, args, kwargs): def test_method(self): return f(self, *args, **kwargs) return test_method setattr(cls, test_name, create_test_method(func, args, kwargs)) delattr(cls, name) return cls @generate_test_cases class TestNewFunctions(unittest.TestCase): @test_case(1, 1, test_name="test-1") @test_case(2, 2, test_name="test-2") @test_case(3, 3, test_name="test-3") def test_identity(self, input_val, expected_output): self.assertEqual(identity(input_val), expected_output)
该方案原理是先通过装饰器暂存所有标注的测试用例,类加载时遍历用例动态生成独立的测试方法,支持自定义测试名称,完全兼容unittest的原生执行逻辑。
内容的提问来源于stack exchange,提问作者Zvi Mints
相关产品推荐
相关产品推荐

