【问题标题】:Unit testing: Does it make sense to test parent object methods?单元测试:测试父对象方法有意义吗?
【发布时间】:2011-04-19 20:03:56
【问题描述】:

假设我正在使用一个框架,该框架有一个名为 Animal 的类。

class Animal(object):
    def speak(self):
        logging.info(self.sound)

我必须继承这个对象才能使用它,它可能看起来像这样:

class Dog(Animal):
    def __init__(self):
        self.sound = 'Woof Woof'

在我看来,我可以做两件事。第一个是这样的:

dog = Dog()
assert dog.sound == 'Woof Woof'

第二个选项是模拟 logging.info 并检查它是否被调用。我对他们俩的感情很复杂。

第一个感觉就像我只是在测试我的配置,而第二个感觉就像我实际上并没有测试我想要的对象。

我正在使用这个简单的示例,因为也许不使用 Django 的人可以给我一些指示。我遇到的真正问题涉及 Django 通用视图。

例如我可以有这个模板视图:

class HomeView(TemplateView):
    template_name = 'home.html'

我是只测试 template_name 是否具有正确的值,还是使用测试客户端进行更高级别的测试来测试完整的视图?

【问题讨论】:

    标签: python django unit-testing tdd


    【解决方案1】:

    不,请确保正确测试父对象(必要时使用模拟)并单独测试子对象方法。这符合封装概念(使事情本地化)。

    如果你不这样做,一个包含许多类的大型项目将耗尽你所有的编码资源而没有任何附加值。

    【讨论】:

    • 所以你是说我应该两者都做?
    • @Pickels:是的。分别测试父母和孩子。
    • 我开始回答问题,但被拉了出来。我同意您的回答,但只是为了详细说明。您的问题可以改写为,当我们对子类进行单元测试时,我应该测试从父类派生的功能吗?如果我的理解是正确的,那么您需要确保所有组件都经过测试。所以有一个父类的测试用例和一个子类的测试用例。你不需要在孩子中测试父功能,除非你重载了功能。
    • @Pickels 是的,单独进行,但不要在孩子中重新测试父母(不必要的重复工作)。
    • 所以要清楚。我需要确保两个对象都经过正确测试?但是,如果父对象属于我认为经过彻底测试的框架,这是否意味着我不必自己测试它?只是确保因为我得到的答案好坏参半。
    【解决方案2】:

    在您的简单示例中,我可能会测试父方法。但在您的 Django 案例中,这意味着测试 Django。那不是你的工作! ;-) 对我来说,这是单元测试的大问题之一:不要测试其他人的代码或第三部分库。确保你的部分是正确的。可能听起来很明显,但在现实生活中并不那么容易 - 至少在我的经验中。

    【讨论】:

      【解决方案3】:

      您显示的测试完全正确 - 您在测试中重复字符串文字 'Woof Woof'

      您可以对Animal 进行类似的测试:

      animal = Animal()
      animal.sound = 'sound'
      animal.speak()
      # test that detects log contains 'sound'
      

      您还可以进行一个测试,获取一个动物列表,例如[Dog, Cat, ...],并检测每个动物的一个实例说出它的声音。

      for animalClass in AnimalList:
          animal = animalClass()
          animal.speak()
          # test that detects log contains animal.sound
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-09
        • 2010-12-16
        • 2014-06-07
        • 1970-01-01
        • 1970-01-01
        • 2016-07-23
        相关资源
        最近更新 更多