2011-04-19 108 views
2

假设我正在使用一个名为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具有正确的价值还是我使用测试客户端做一个更高的水平测试,测试的完整视图?

回答

5

不,请确保父对象已正确测试(必要时模仿)并分别测试子对象方法。这符合封装的概念(使本地事情变得重要)。

如果你不这样做,一个包含很多类的大型项目会耗尽你所有的编码资源,因为没有附加价值。

+0

所以你说我应该两个都做? – Pickels 2011-04-19 20:18:51

+0

@皮克尔:是的。分别测试父母和孩子。 – 2011-04-19 20:20:29

+0

我开始回答这个问题,但被退出了。我同意你的回答,但只是为了阐述。当我们测试孩子课时,你的问题可以改写为:我应该测试从父类派生的功能。 如果我的理解是正确的,那么你需要确保所有的组件都经过测试。因此,有一个父类的测试用例和一个用于子类的测试用例。您不需要在子项中测试父项功能,除非您的功能过载。 – 2011-04-19 20:20:49

3

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

1

您显示的测试是完全正确的 - 您在测试中重复字符串文字'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