python - 单元测试测试类族的重用

标签 python unit-testing

我在为测试系列组织基于 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/

相关文章:

java - 是否有具有集成和单元测试套件的 Java 开源项目?

python - 使用关键字查找项目

python - 是否可以不收集标记测试?

python - 标签编号到名称字符串

python-3.x - unittest模拟和多重继承: TypeError: metaclass conflict

android - 在 Jenkins (Gradle) 上运行 android 单元测试和仪器测试

Python从一个函数返回多个字典

python - 如何在flask-admin Inherited Base View 中允许POST方法?

c# - 如何模拟 IDataReader 以测试将 SqlDataReader 转换为 System.DataView 的方法

asp.net - ASP.NET项目的单元测试出现问题(运行测试时出现NullReferenceException)