我在为测试系列组织基于 unittest
的类测试时遇到问题。例如,假设我实现了一个“字典”接口(interface),并且有 5 个不同的实现要测试。
我确实编写了一个测试字典接口(interface)的测试类。但是我怎样才能很好地重用它来测试我的所有类(class)呢?到目前为止我做得很丑:
DictType = hashtable.HashDict
在文件顶部,然后在测试类中使用 DictType
。为了测试另一个类,我手动将 DictType
更改为其他内容。
否则怎么能做到这一点?无法将参数传递给 unittest
类,有更好的方法吗?
最佳答案
我用标准 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
。有时使用“ Hook 方法”公开 MappingTestBase
会更方便。当被测试的类型在所有情况下都没有完全相同的接口(interface)时,可以通过让子类根据需要覆盖 Hook 方法来解决这个问题——这是“模板方法”设计模式,参见例如this page其中包含我关于设计模式的几个视频讲座的评论和时间线集合——第二部分大约前 30 分钟是关于模板方法及其变体。
当然,您不必将所有这些都放在一个模块中(虽然我经常发现以这种方式布置最清楚,但您也可以为您正在测试的每种类型制作一个单独的测试模块,每个导入
带有抽象基类的模块)。
关于python - 单元测试测试类族的重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2532197/