unittest测试对类家族的重用

时间:2010-03-28 07:30:16

标签: python unit-testing

我在为测试系列组织基于unittest的类测试时遇到问题。例如,假设我实现了一个“字典”接口,并且有5个不同的实现想要测试。

我写了一个测试字典界面的测试类。但是我怎样才能很好地重用它来测试我的所有类?到目前为止,我很难看:

DictType = hashtable.HashDict

在文件顶部,然后在测试类中使用DictType。要测试另一个类,我手动将DictType更改为其他类。

怎么办呢?无法将参数传递给unittest类,那么有更好的方法吗?

2 个答案:

答案 0 :(得分:5)

我用标准unittest解决这个问题的方法是通过子类化 - 毕竟覆盖数据就像覆盖方法一样容易。

所以,我有一个测试的基类:

class MappingTestBase(unittest.TestCase):
    dictype = None
    # write all the tests using self.dictype

和子类:

class HashtableTest(MappingTestBase):
    dictype = hashtable.HashDict

class OtherMappingTest(MappingTestBase):
    dictype = othermodule.mappingimpl

此处,子类只需覆盖dictype。有时候公开MappingTestBase使用“钩子方法”也更方便。当被测试的类型在所有情况下都没有完全相同的接口时,可以通过让子类根据需要覆盖钩子方法来解决这个问题 - 这是“模板方法”设计模式,参见例如this page有一个评论和时间表的集合,包括我的几个关于设计模式的视频讲座 - 第二部分是关于模板方法及其变体的大约前30分钟。

当然,你不必在一个模块中拥有所有这些(虽然我经常发现这样做很清楚,你也可以为你正在测试的每种类型制作一个单独的测试模块,每个模块使用抽象基类import模块。)

答案 1 :(得分:0)

您可以查看testscenarios,它允许您设置名为scenario的列表。然后,代码为列表

中的每个值/方案生成测试类的版本

请参阅the example

因此,在您的情况下,场景将是[{dicttype:hashtable.HashDict},{dicttype:otherimpl.class},]之类的列表,并在测试代码中使用self.dicttype。