如何为不同的类运行相同的测试用例?

时间:2010-11-30 16:55:10

标签: python unit-testing

我有几个共享一些不变量并具有通用接口的类,我想为每个类自动运行相同的测试。

作为一个例子,假设我有几个类实现了分区数据集的不同方法。这里的常见不变量是,对于所有这些类,所有分区上的并集应该等于原始数据集。

我目前看起来像这样:

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

2 个答案:

答案 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