sna*_*ile 7 python unit-testing coding-style
我正在测试我的应用程序.大多数测试所做的是调用具有特定参数的函数,并声明返回值与期望值的相等性.
在某些测试中,预期的返回值是一个相对较大的对象.例如,其中之一是将5个字符串映射到元组列表的字典.它需要40-50个重复的代码行来定义该对象,但该对象是我正在测试的函数之一的期望值.我不想在测试函数中定义40-50行代码来定义预期的返回值,因为我的大多数测试函数都包含3-6行代码.我正在寻找这种情况的最佳实践.将冗长的定义放在测试中的正确方法是什么?
以下是我想要解决这个问题的想法,从我看到的最好到最差的排名:
测试对象的样本:基于密钥的子集进行一些相等的断言.为了代码优雅,这将牺牲测试的彻底性.
在单独的模块中定义对象:在单独的.py文件中编写冗长的40-50行代码,在测试中导入模块,然后进行相等的断言.这将使测试简洁明了,但我不喜欢单独的文件作为测试的补充; 毕竟,对象定义是测试的一部分.
在测试函数中定义对象:这是我希望避免的简单解决方案.我的测试非常简单明了,并且该对象的冗长定义不合适.
也许我太痴迷于干净的代码,但我不喜欢上述解决方案.还有其他一些我没有想到的常见做法吗?
我建议将测试代码和测试数据分开。因此,我通常创建一个抽象基类,其中包含我想要测试的方法,并创建几个特定的测试用例类以将方法与数据联系起来。(我使用Django框架,所以我放入了所有抽象测试类testbase.py):
测试库.py:
class TestSomeFeature(unittest.TestCase):
test_data_A = ...
def test_A(self):
... #perform test
Run Code Online (Sandbox Code Playgroud)
现在是test.py中的实现
class TestSomeFeatureWithDataXY(testbase.TestSomeFeature):
test_data_A = XY
Run Code Online (Sandbox Code Playgroud)
测试数据也可以外部化,例如 JSON 文件:
class TestSomeFeatureWithDataXYZ(testbase.TestSomeFeature):
@property
def test_data_A(self):
return json.load("data/XYZ.json")
Run Code Online (Sandbox Code Playgroud)
我希望我的观点足够清楚。在你的情况下,我强烈选择使用数据文件。Django 通过在执行任何测试之前将测试装置加载到数据库中来支持这种开箱即用的功能。