unittest测试对类家族的重用

zah*_*pov 7 python unit-testing

我有问题unittest为测试系列组织我的基础类测试.例如,假设我实现了一个"字典"接口,并且有5个不同的实现想要测试.

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

DictType = hashtable.HashDict
Run Code Online (Sandbox Code Playgroud)

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

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

Ale*_*lli 5

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

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

class MappingTestBase(unittest.TestCase):
    dictype = None
    # write all the tests using self.dictype
Run Code Online (Sandbox Code Playgroud)

和子类:

class HashtableTest(MappingTestBase):
    dictype = hashtable.HashDict

class OtherMappingTest(MappingTestBase):
    dictype = othermodule.mappingimpl
Run Code Online (Sandbox Code Playgroud)

这里,子类只需要覆盖dictype.有时,MappingTestBase使用"钩子方法" 也更容易.当被测试的类型没有在所有情况下完全相同的接口,这可以通过让子类覆盖需要挂钩的方法来制定各地-这是"模板方法"设计模式,例如参见本页面具有评论和时间表收集了我的几个关于设计模式的视频讲座 - 第二部分是关于模板方法及其前30分钟的变体.

当然,您不必将所有这些都放在一个模块中(尽管我经常发现这样做很清楚,您也可以为每个类型制作一个单独的测试模块,每个import模块都在模块中与抽象基类).