2016-07-28 7 views
0

もう、別の方法を使用する方法があります。私は二次的方法のテストをしています。そして今、私はmainメソッドの単位テストを書いています。別のメソッドを含むメソッドで単体テストを書くには?

私はテストにメソッドのコードを見ずにテストを書く必要があると思います。つまり、実装で考えているテストを考えていないので、これに続いて、メインメソッドのテストでは2次メソッドの機能とメインメソッドの機能性をテストする必要があります。

たとえば、私は車で2つのガレージを持っています。ガラガでは、車と私が持っている車の数を持っています。だから私はガレージに新しい車を追加したり、車を取り外したり、ガレージから別の車に車を移したりすることができます。だから、私はこの方法を持っています:

  • ガレージに車を関連付ける必要があり、ガレガと車を関連付ける必要があり車の数をudpdateする1つの方法。これは私が新しい車を持っている時です。
  • ガレージから車を取り外す方法の1つで、ガレージと車とは無関係で、車の台数を更新する方法です。これは私がもう車を持っていないときです。例えば、私がそれを売ったからです。
  • 車を移動する方法では、最初のガレージから車を取り外し、新しいガレージに車を追加します。このメソッドはaddメソッドとremoveメソッドを呼び出します。私はremoveCarとaddCarをテストし、私は彼らが期待通りに動作することを確信している場合

    public void transferCar(garage1, garage2, car) 
    { 
        removeCar(garage1, car); 
        addCar(garage2, car); 
    } 
    

    は、転送をテストするために、私はすべてをテストする必要があります。

転送メソッドのコードは、そのようなものになるだろうaddCarの場合とremoveCarのすべての場合についてのケース? transferCarの実装がわからない場合、このメソッドがremoveCarとaddCarを使用するかどうかわからないので、メソッドが期待通りに機能するかどうかわかりません。

つまり、transferCarをテストすると、テストはremoveCarのコードの100%、addCarのコードの100%、transferCarメソッドのコードの100%をカバーする必要があります。 removecarとaddCarはtransferCarに一度だけ追加され、期待通りに動作しますが、removecarとaddCarは100%カバーされません。

removeCarとaddCarのすべてのケースをテストする必要がある場合は、同じテストを2回実行しています。 removeCarとaddCarを使って多くの場所で使用するので、私はリファクタリングしたコードを持っていますが、私のテストコードでは何度も同じテストがあります。

これは非常に単一の例ですが、いくつかのメソッドを使用するメソッドがあり、この他のメソッドではアンサーが使用され、メインのmathodはすべてのメソッドのすべてのコードをカバーする必要があります。多くの仕事。

私はメソッドをテストすると、このメソッドのコードの100%と、このメソッドで使用されるメソッドのコードの100%をカバーしています。期待して、一度各二次的方法を呼び出す?

ありがとうございました。

答えて

1

TDDは、実装の詳細についての知識が必要ではないことを意味するわけではありません。テストの最初のプログラミングの概念です。ユニットテストはホワイトボックステストです。このために、クラス実装が何であるかを正確に把握する必要があります。ブラックボックステストでは、実装の詳細を知る必要はないかもしれません。

厳密に言うと、単体テストはクラスのパブリックインターフェイスのみをテストし、クラス(プライベートコードと保護されたコードをすべて含む)に対して100%カバレッジを与えるかどうかを確認する必要があります。

関数のカバレッジは、その特定の関数のいくつの行のコードがテストされ、何個の分岐(if-else、switch ..)が検証されたかを調べることです。

あなたのケースでは、車がガレージ1からガレージ2に転送されている場合は、トランスファーカーの簡単なテストケースを作成し、アサーションチェックを行います。それはtransferCar()の100%カバレッジになります。 addCar()およびremoveCar()のカバレッジを向上させるために、広範囲かつ複数のテストケースを記述することができ、それらがパブリックメソッドであることを願っています。もしそれらが私的であるならば、チェックhere

実際の実装を呼び出すのをスキップしたい場合は、モックが行く方法ですが、それはあなたのコードをどのように実装したかによって決まります..テスト中の関数)は独自のインスタンスメソッドを呼び出し、呼び出された関数をモックするのは難しいです。

+0

しかし、可能であれば、単体テストを実装する人は、このようにしてエラーを見つけるのが容易であるため、テストするメソッドを実装する人物が異なっている必要があります。したがって、テストを実装する人は、おそらく実装について何も知らないでしょう。 –

+0

だから、それぞれの機能が個別にどのように実装されているかを除いて、両当事者がクラス構造、パブリックメソッド、インタフェース、スタブ/偽造、偽装などの詳細を知ることになりますか?それは正しいアプローチであるかどうかは分かりませんが、あまりにも多くの冗長なコードと余分な努力を受け入れる必要があると思います。 –

+0

この質問はtddタグの下に書かれています。助言。しかし、テストに振る舞いに焦点を当てることは非常に良い考えです(つまり、 "1つのメソッドごとに1つのユニットテスト"のようなルールに従わないで、テストするシステムのすべての可能な使用法をテストするだけです。そのオブジェクトのメソッド、そうすることができます)。 – prgmtc

関連する問題