0

是否有测试使用继承的类的最佳实践?

例如,如果我有一个类 BaseNode

public class BaseNode
{
    int testInt;//attribute

    //assume getters and setters and constructor

    public function somethingComplicated()
    {
        //put complex code here
    }
}

以及另一个继承自 BaseNode 的名为 InputNode 的类。

public class InputNode extends BaseNode
{
    int secondTest;//attribute

    //assume getters and setters and constructor
}

如果我为这两个类编写 getter 和 setter,我需要测试什么?

您真的必须在 BaseNode 和 InputNode 类中为 getTestInt() 编写测试吗?如果您在 InputNode 类中为 getTestInt() 编写测试,这是否也自动算作 BaseNode 类的测试?

编辑问题以使其更具体。我不只是询问 getter 和 setter。

如果您在 Base 类中为 somethingComplicated() 编写测试,您是否会自动假设该测试对 InputNode 类有效?

我最初使用 getter 和 setter 作为一个简单的例子来尝试说明这个概念。我并不是说我只想测试 getter 和 setter。

4

3 回答 3

2

首先,setter 是一种代码味道,很大程度上是因为它们增加了测试的复杂性。他们这样做是因为它们可能会增加对象可能处于的状态数量。

最佳做法是:

  1. 最小化二传手
  2. 每个派生对象都必须通过每个基类测试,因此请确保您将测试设置为做到这一点。如果他们没有通过,那么这意味着基本实例是不可替代的。这样做的好处是您不需要为每个派生类编写一套完整的新测试。
  3. 您将需要测试来专门确保您的新设置器和行为不会与基类行为不正确地交互。
于 2013-05-23T14:32:15.887 回答
1

您还必须测试基类,因为基节点的方法/getter 可能会受到基类中的代码的影响,即:

  • 被派生类覆盖
  • 派生类中的代码可能会导致副作用(通过更改基类字段等)
于 2013-05-23T14:51:23.550 回答
1

基类的全套测试需要为每个派生类通过,以证明 Liskov 可替换性。此外,还需要对派生类提供的专业化进行测试。出于这个原因,许多人选择以一种反映被测类的方式来组织测试类。

给定一个InputNode包含子类的类BaseNode,我们可能会有如下所示的测试类[欢迎对我的 Java 语法进行更正]:

public class BaseNodeTest {
    protected BaseNode getBaseNode () {
        return new BaseNode();
    }

    public void test_complicated_BaseNode_behavior () {
        BaseNode bn = getBaseNode();
        // actual test code...
    }
}

public class InputNodeTest extends BaseNodeTest {
    protected BaseNode getBaseNode () {
        return new InputNode();
    }

    public void test_InputNode_specific_behavior () {
        InputNode in = getBaseNode();
        // actual test code...
    }
}

关键是InputNodeTest它将运行所有测试BaseNodeTestInputNode添加自己的测试。这确保InputNode可以在任何BaseNode预期 a 的地方使用它。

于 2013-05-23T15:46:23.343 回答