【问题标题】:How to test for order of superclass in python?如何在python中测试超类的顺序?
【发布时间】:2018-09-04 14:41:01
【问题描述】:

给出以下代码:

class X(Mixin, Y):
    pass

如何编写单元测试以确保 Mixin 类在 X 的超类声明中位于 Y 之前?

【问题讨论】:

  • 最好简单地编写一个只有在X.foo 解析为Mixin.foo 时才通过的测试(对于某些属性foo)。如果您无法识别这样的测试,那么如果 MixinY 之前,它为什么重要?
  • 确实,这是一个简单的测试完整性的方法。它解决了我的问题,因为我的 Mixin 只执行一个函数覆盖。唯一的缺点是,如果我在 Mixin 中添加更多的函数覆盖,我可能会在所有子类中编写一个新的测试。

标签: python python-3.x unit-testing testing


【解决方案1】:

不要测试它。除非您正在为 Python 实现本身编写测试。

您的库的测试套件不负责验证 Python 解释器是否按设计工作。在阅读代码时,Mixin 出现在声明中的 Y 之前是不言而喻的,并且 Python 在多重继承中从左到右评估初始化器的事实记录在 here 中。

注意:不是说不应该测试这种行为,只是用户代码不需要重复这样的测试。它应该包含在实现的测试套件中,例如here 用于 CPython。

【讨论】:

  • 有趣,你是对的,测试 CPython 解释器的行为超出了我的单元测试范围。但是,我的Mixin 的目标是从大约 10 个类中分解一个函数覆盖。我不想在子类中复制此函数的测试。我的理由是我只需要确保我的类是Mixin 的子类,但这还不够,因为当MixinY 之后会跳过函数覆盖。所以,为了测试的完整性,我需要测试超类的顺序..
  • 然后只需调用必要的方法并断言结果符合预期。您想测试 Mixin 提供的任何功能/方法,并在此过程中模拟您需要的任何内容。在 mro 上断言过于元,因为代码的用户可能对这样的实现细节不感兴趣。
【解决方案2】:

您可以解析X.mro() 的输出,它返回method r解决方案order 并确保Mixin出现在Y之前:

class Mixin: pass

class Y: pass

class X(Mixin, Y): pass

print(X.mro())
# [<class '__main__.X'>, <class '__main__.Mixin'>, <class '__main__.Y'>, <class 'object'>]

但是,我不确定这不是实现细节,也不确定可以(或应该)在多大程度上依赖子类顺序。如果你的代码依赖它,那可能是设计出了问题。

【讨论】:

  • 使用 mro() 的结果是个好主意,但是,它会输出包含超类的所有超类的列表。我必须添加代码以确保 Mixin 在结果列表中位于 Y 之前。我不想测试所有的超类树。
  • @moppag 问题是你是否应该测试它。如果你算上我和 wim 的意见,答案是否定的。
猜你喜欢
  • 2021-05-25
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多