unit-testing - 测试使用继承的类是否有任何最佳实践?

标签 unit-testing testing inheritance language-agnostic

<分区>

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

例如,如果我有一个类 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。

最佳答案

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

最佳实践是:

  1. 最小化 setter
  2. 每个派生对象都必须通过每个基类测试,因此请确保您设置测试以做到这一点。如果他们没有通过,那么这意味着基础实例不是 liskov 可替代的。这样做的好处是您不需要为每个派生类编写一套完整的新测试。
  3. 您需要进行测试以明确确保您的新 setter 和行为不会与基类行为不正确地交互。

关于unit-testing - 测试使用继承的类是否有任何最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16715347/

相关文章:

android - 诸如单元测试和日志记录之类的编程实践在 Android 上重要吗?

node.js - 不再允许 Zombie.js 选项?

ruby-on-rails - 测试 Rails 时管理模型关联的复杂性

angular - 找不到模块 '@angular/cdk/testing'

c++ - 指向尚未初始化的成员

android - 如何避免 Android 测试应用程序中的代码重复?

unit-testing - 我在哪里以及如何学习软件测试技术?

python - 跳过假设中的伪造示例

C++ 重写一个成员变量

c++ - 如何从派生类复制构造函数调用基类复制构造函数?