3

私はTDDを学んでいますが、プライベート変数/保護変数について質問があります。私の質問は、テストしたい関数がプライベート変数で動作している場合、どのようにテストすればよいですか?

これが私が取り組んでいる例です:

2D配列であるTableというインスタンス変数を含むというクラスがあります。2D配列のすべての値に引数を掛けるinternalRepresentationという関数を作成したいと思います。multiplyValuesByNn

だから私はそれのテストを(Pythonで)書きます:

def test_multiplyValuesByN (self):  
    t = Table(3, 3) # 3x3 table, filled with 0's
    t.set(0, 0, 4) # Set value at position (0,0) to 4
    t.multiplyValuesByN(3)

    assertEqual(t.internalRepresentation, [[12, 0, 0], [0, 0, 0], [0, 0, 0]])

さて、私がinternalRepresentationプライベートまたは保護すると、このテストは機能しません。依存しないようにテストを作成するにはどうすればよいですか?internalRepresentationそれでも、呼び出した後に正しく見えるかどうかをテストしますmultiplyValuesByNか?

4

4 に答える 4

10

オブジェクトの内部表現に依存するべきではありません。そのため、プライベートまたは保護されているとマークされています。t.multiplyValuesByN(3) を呼び出したときに、t に対してどのような観察可能な変更が行われるかを検討してください。次に、観察できることをテストします。

def test_multiplyValuesByN (self):  
    t = Table(3, 3) # 3x3 table, filled with 0's
    t.set(0, 0, 4) # Set value at position (0,0) to 4
    t.multiplyValuesByN(3)

    assertEqual(t.get(0,0), 12)
于 2010-06-15T21:21:41.370 に答える
3

他の人は良い回答を投稿しましたが、IMHO は 1 つのことを強調できませんでした: デザインの側面です (Peter Tillemans が言及しましたが)。そのため、これについて少し説明を加えます。

TDD を実行すると、API の設計と実装を効果的にテストできます。メソッド呼び出しの結果が外部から見えにくい、または見えない場合は、ほとんどの場合、クラス インターフェイスが適切に設計されていないことを示しています。クラスのテストを書くのが難しい場合、それを実生活で使用することも通常は困難です。つまり、単体テストは実際にはクラスの最初のクライアントです。そのため、テスト ケースでクラス インターフェイスを使用するのが難しい場合は、元に戻って API を再設計して使いやすくすることを検討する必要があります (可能であれば、カプセル化を犠牲にしないでください)。

于 2010-06-16T09:34:56.220 に答える
3

それが内部の場合、それはクラス外の誰のビジネスでもなく、テストも含まれます。

TDD では、クラスの API を設計しており、将来のクライアントもクラスの観察可能な動作のみを見ることができます。

これは言うは易く行うは難しです。

テストでは、セットアップ - 操作 - チェック ( - ティアダウン) というパターンが繰り返されることがよくあります。

セットアップ フェーズは、オブジェクトを前提条件の状態にする役割を果たします。

チェック フェーズでは、クラスの観察可能な動作を通じて事後条件を検証する必要があります。目に見えない状態を保存しても意味がありません。

于 2010-06-15T21:27:23.263 に答える
0

プライベート変数/状態をテストしないでください。テストでは、テスト対象のユニットがその仕様に準拠していること、およびその仕様がそのインターフェイスによって決定されることを確認する必要があります。したがって、テストはテスト ユニットへの入力に関して記述し、出力が期待どおりであることを確認する必要があります。

テスト対象のユニットの実装を (たとえば効率上の理由で) 変更できるようにしたいが、それが期待どおりに機能することを確認したい。したがって、プライベート状態をチェックすると、この状況で問題が発生します。

于 2010-06-15T21:26:16.320 に答える