我有几个共享一些不变量并具有通用接口的类,我想为每个类自动运行相同的测试。
作为一个例子,假设我有几个类实现了分区数据集的不同方法。这里的常见不变量是,对于所有这些类,所有分区上的并集应该等于原始数据集。
我目前看起来像这样:
class PartitionerInvariantsTests(unittest.TestCase):
def setUp(self):
self.testDataSet = range(100) # create test-data-set
def impl(self, partitioner):
self.assertEqual(self.testDataSet,
chain.from_iterable(partitioner(self.testDataSet))
然后我为每个要用该类实例测试的类添加一个不同的函数调用impl
。当针对多个测试功能执行此操作时,此问题变得明显。假设我有5个测试函数和5个我想测试的类。这将使25个函数在调用所有测试时几乎完全相同。
我想到的另一种方法是将模板实现为超类,然后为我想要测试的每个类创建一个子类。子类可以提供实例化类的功能。问题是默认的测试加载器会认为(不可用的)基类是一个有效的测试用例并尝试运行它,这会失败。
那么,你的建议是什么?
P.S。:我正在使用Python 2.6
答案 0 :(得分:12)
您可以使用多重继承。
class PartitionerInvariantsFixture(object):
def setUp(self):
self.testDataSet = range(100) # create test-data-set
super(PartitionInvariantsFixture, self).setUp()
def test_partitioner(self):
TestCase.assertEqual(self.testDataSet,
chain.from_iterable(self.partitioner(self.testDataSet))
class MyClassTests(TestCase, PartitionerInvariantsFixture):
partitioner = Partitioner
答案 1 :(得分:0)
子类PartitionerInvariantsTests
:
class PartitionerInvariantsTests(unittest.TestCase):
def test_impl(self):
self.assertEqual(self.testDataSet,
chain.from_iterable(self.partitioner(self.testDataSet))
class PartitionerATests(PartitionerInvariantsTests):
您要测试的每个Partitioner类。然后,凭借继承,将为每个Partitioner类运行test_impl
。
跟进Nathon的评论,你可以通过仅继承object
来阻止基类的测试:
import unittest
class Test(object):
def test_impl(self):
print('Hi')
class TestA(Test,unittest.TestCase):
pass
class TestB(Test,unittest.TestCase):
pass
if __name__ == '__main__':
unittest.sys.argv.insert(1,'--verbose')
unittest.main(argv = unittest.sys.argv)
运行test.py yield
test_impl (__main__.TestA) ... Hi
ok
test_impl (__main__.TestB) ... Hi
ok
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK