web-dev-qa-db-ja.com

同じテストケースまたは個別のテストケースでデフォルト値とセッターをテストする

@Testメソッド内でテストケースをグループ化することをお勧めしますか、またはテストシナリオごとに1つの@Testメソッドを使用しますか?たとえば、アプリケーションでコンテキストを設定する方法がいくつかあるとしましょう。

次のアイデアは受け入れられますか?

@Test
public void testContextSetting() {
    // Test default setting
    assert(...)

    // Test setting a context variable
    assert(...)

    ...
}

または、各メソッドを可能な限りアトミックにして、次のようにすることをお勧めします。

@Test
public void textDefaultSetting() {
    // Test default setting
    assert(...)
}

@Test
public void testSettingContextVar() {
    // Test setting a context variable
    assert(...)

    ...
}

任意のフィードバックをいただければ幸いです。

40
Ariod

メソッドごとに1つのテストケースを用意することをお勧めします。

まず、コードに埋め込まれたコメントを探すよりも、ケースがメソッドに分割されている場合、どのケースがテストされているかを確認する方が簡単です。ほとんどのIDEではメソッドの概要が表示されるため、「エッジケースXYZをテストしましたか?」次に、コメントを探したり、エッジケースを設定するコードを探したり、setupContextEdgeCaseXYZ()という名前のメソッドを探します。

2番目の理由は、複数のケースが一緒にある場合、1つは失敗し、他のケースは実行されない可能性があることです。

 testDefaultCase()
 testInvalidInput()
 testEdgeCase1()
 testEdgeCase2()

この構造では、入力チェックが不良であり、エッジケース2が不適切に処理されていると判断するのが簡単ですが、他のケースは問題ありません(2つの失敗したケースが関連していて、問題の診断が速くなる場合があります)。

3番目の理由は、前のテストセットの値を誤って残して、後のテストを目立たない方法で無効にする可能性があることです。簡単な例:

@Test
public void testMyMethod() {
  //test default
  String test = Foo.bar(null);
  assertEquals("foo", test);

  //test case 1
  Foo.bar(aValue);
  //Oops forgot to set value above, this passes regardless of 
  //what the above call does
  assertEquals("foo", test);
}

ケースをばらばらにすることで、コンパイルエラーまたは警告に変わるため、上記のような間違いを回避できます。

34
M. Jessup

Divide et impera :)そのため、複数の小さなケースに分割されます...エラーの場合の修正がより簡単になります。

11
Cris

ベストプラクティスは、メソッドごとに1つのテストケースを持つことです。メソッド名は、実行しているテストを説明しています。アサートが1つだけの場合、テストが失敗するとデバッグが容易になります。

11
RMT

テストアサーションを混同しています。複数のassertsを使用したテストメソッドは、デフォルト設定およびコンテキスト変数の設定をテストします。ただし、1つのことをテストするテストメソッドは、複数のassertsを持つこともできます。

使用するのに適したパターンは、各テストケースに4つのフェーズがあることです。

  1. Setup:テストを実行するために必要なオブジェクトを作成し、必要に応じてそれらのオブジェクトを変更して、必要な初期状態にします。
  2. 練習:テストする操作を実行する場所。これは、1つのメソッド呼び出しまたはコンストラクター呼び出しになります。
  3. Verify:テスト対象のオブジェクトが正しい状態にあることを確認し、演習で呼び出したメソッドから返された値を確認しますフェーズ(値を返した場合)。ここにassertsを配置します。このパターンを使用する場合、複数のassertsをverifyフェーズに配置することに問題はありません。
  4. Teardown:テストの実行に使用したオブジェクトを破棄または閉じる場所。

これは、Gerard Meszaros著の本xUnit Test Patterns:Refactoring Test Codeで推奨されているアプローチです。

このパターンを最初の例にあるパターンと比較してください。

  1. 初期設定
  2. 運動コンストラクタ
  3. デフォルトを確認
  4. コンテキスト変数を設定する練習
  5. コンテキスト変数の設定を確認します
  6. 取り壊す
2
Raedwald

Eclipseはメソッドごとにユニットテストを生成しますが、これは合理的なアプローチのようです。テストしたメソッドが複雑すぎて1つのテストメソッドを使用してテストできない場合は、再ファクタリングすることを検討してください。

しかし、はるかに優れたアプローチは、TDDを使用して、設計と実装の残りの部分を推進するテストを事前に記述することです。

個人的には、Java Eclipseのコードカバレッジ http://www.eclemma.org とともに、メソッドごとに1つのテストを行うことを好みます。

ツールはあなたが実際にテストしているものを教えてくれます。

0
Prem