继承,组合或其他 - 我应该在测试中继承实用程序类吗?

时间:2012-03-21 06:04:35

标签: python oop inheritance

在他的书 Java Design 中,Peter Coad说子类应该满足的五个标准之一是子类“不是仅仅是一个实用类的子类(你想要的有用功能)重用)。“对于Java中的一个例子,他说将你的一个域类作为the Observable class的子类违反了他的规则:“Observable是一个实用类,一组有用的方法 - 仅此而已。”

在这种情况下,这里有一些示例测试类,在我写完的实际测试之后被模式化:

class BaseDataGeneratorTestCase (unittest.TestCase):
    def _test_generate_data(self, generator, expected_value):
        # Imagine there's a lot more code here, making it
        # worthwhile to factor this method out.
        assert generator.generate_data() == expected_value

class DataGeneratorTests (BaseDataGeneratorTestCase):
    def test_generate_data(self):
        self._test_generate_data(DataGenerator(), "data")

class VariantDataGeneratorTests (BaseDataGeneratorTestCase):
    def test_generator_data(self):
        self._test_generate_data(VariantDataGenerator(),
                                 "different data")

虽然这个例子很简单,但考虑到真正的测试及其周围系统当然要复杂得多。我认为这个例子可以作为一种工具,试图澄清一些关于正确使用继承的困惑。

子类化BaseDataGeneratorTestCase是个坏主意吗?它是否有资格作为“有用的功能[我想]重用”? _test_generate_data应该只是一个函数吗,而不是任何类?

1 个答案:

答案 0 :(得分:1)

基本上你可以用任何你喜欢的方式解决问题。 OOP只是一种范例,可以帮助您以更清晰,更可维护的方式设计事物。

那么,在你想要使用继承时,你应该问自己的问题是,他们有相同的角色,你只想添加功能?或者你想只使用“基础”类中的好方法?

这只是一个概念问题,在你的小例子中,它可以采用相同的概念,但基本上,你只是将基类用作实用程序。

如果你希望基类实际上是一个基类,你应该设计它,这样每个继承的类都会表现得相似。

我同意从概念上讲,为所有类似的测试都有一个单元测试基类是有意义的。

相关问题