Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何为不同的类运行相同的测试用例?_Python_Unit Testing - Fatal编程技术网

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

Python 如何为不同的类运行相同的测试用例?,python,unit-testing,Python,Unit Testing,我有几个类,它们共享一些不变量,并且有一个公共接口,我想为它们中的每一个自动运行相同的测试 例如,假设我有几个类,它们实现了对数据集进行分区的不同方法。这里常见的不变量是,对于所有这些类,所有分区上的并集应该等于原始数据集 我现在拥有的是这样的东西: class PartitionerInvariantsTests(unittest.TestCase): def setUp(self): self.testDataSet = range(100) # create tes

我有几个类,它们共享一些不变量,并且有一个公共接口,我想为它们中的每一个自动运行相同的测试

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

我现在拥有的是这样的东西:

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个函数看起来几乎相同

我考虑的另一种方法是将模板实现为一个超类,然后为我要测试的每个类创建一个子类。子类可以提供一个实例化类的函数。问题是默认的测试加载器会考虑(不可用的)基类为有效的测试用例,并尝试运行它,这将失败。

那么,你有什么建议


注意:我正在使用Python2.6子类
PartitionerInvariantsTests

class PartitionerInvariantsTests(unittest.TestCase):
    def test_impl(self):
        self.assertEqual(self.testDataSet, 
                         chain.from_iterable(self.partitioner(self.testDataSet))

class PartitionerATests(PartitionerInvariantsTests):
对于要测试的每个分区器类。然后,
test\u impl
将通过继承为每个分区器类运行

根据Nathon的评论,您可以通过让基类仅从
对象继承来防止基类被测试:

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产生

test_impl (__main__.TestA) ... Hi
ok
test_impl (__main__.TestB) ... Hi
ok

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

您可以使用多重继承

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

如果基类不是继承自
unittest.TestCase
,unittest会尝试运行基类吗?@Nathon:既然你这么说了,我还没有试过。@Nathon,如果你想把你的想法作为答案,我很乐意删除我的。@unutbu,不用担心;我不知道如何处理Python的unittest模块,kevpie的答案与我想说的差不多。是的,但是基类也会运行,并且会失败。有没有办法运行子类而不是基类?链迭代器应该使用list(chain…)进行迭代。为什么我们需要在setup中调用super?+1我的下巴掉下来了。在SO上有几十个类似的问题(使用core unittest在不同的对象上运行相同的测试),但这绝对是我找到的最好答案。我甚至不知道(或不记得)Python有多重继承。我尝试使用此模板创建一个简单的示例,它看起来好像从未调用过安装程序。@eric.frederich您是否愿意将您的示例作为问题发布并从这里链接到它,以便我可以查看?