0

継承を使用するクラスをテストするためのベスト プラクティスはありますか?

たとえば、クラス BaseNode がある場合

public class BaseNode
{
    int testInt;//attribute

    //assume getters and setters and constructor

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

もう 1 つのクラスは、BaseNode を継承する InputNode です。

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

    //assume getters and setters and constructor
}

両方のクラスのゲッターとセッターを作成する場合、何をテストする必要がありますか?

BaseNode クラスと InputNode クラスの両方で getTestInt() のテストを作成する必要があるのでしょうか? InputNode クラスで getTestInt() のテストを作成すると、自動的に BaseNode クラスのテストとしてカウントされますか?

より具体的にするために質問を編集しました。私はゲッターとセッターについて尋ねているだけではありません。

Base クラスで somethingComplicated() のテストを作成した場合、そのテストが InputNode クラスに対して有効であると自動的に想定しますか?

私は当初、概念を説明するための簡単な例としてゲッターとセッターを使用しました。ゲッターとセッターだけをテストしたかったわけではありません。

4

3 に答える 3

2

まず第一に、セッターはテストの複雑さを増すため、コードの匂いがします。これは、オブジェクトが取り得る状態の数を増やす可能性があるためです。

ベスト プラクティスは次のとおりです。

  1. セッターを最小化する
  2. すべての派生オブジェクトは、すべての基本クラス テストに合格する必要があるため、テストを確実に実行するように設定してください。それらが合格しない場合、それは基本インスタンスがリスコフ置換可能でないことを意味します。これの利点は、派生クラスごとに新しいテストの完全なセットを作成する必要がないことです。
  3. 新しいセッターと動作が基本クラスの動作と誤って相互作用しないことを具体的に確認するためのテストが必要です。
于 2013-05-23T14:32:15.887 に答える
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すべてのテストを実行し、独自のテストを追加することですBaseNodeTest。これにより、 が期待される場所ならどこでも を使用できることがInputNode保証されます。InputNodeBaseNode

于 2013-05-23T15:46:23.343 に答える
1

ベース ノードのメソッド/ゲッターは、次のようなベース クラスのコードの影響を受ける可能性があるため、ベース クラスもテストする必要があります。

  • 派生クラスによるオーバーライド
  • 派生クラスのコードは副作用を引き起こす可能性があります (基本クラスのフィールドの変更などにより)
于 2013-05-23T14:51:23.550 に答える