@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(...)
...
}
任意のフィードバックをいただければ幸いです。
メソッドごとに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);
}
ケースをばらばらにすることで、コンパイルエラーまたは警告に変わるため、上記のような間違いを回避できます。
Divide et impera :)そのため、複数の小さなケースに分割されます...エラーの場合の修正がより簡単になります。
ベストプラクティスは、メソッドごとに1つのテストケースを持つことです。メソッド名は、実行しているテストを説明しています。アサートが1つだけの場合、テストが失敗するとデバッグが容易になります。
テストとアサーションを混同しています。複数のassert
sを使用したテストメソッドは、デフォルト設定およびコンテキスト変数の設定をテストします。ただし、1つのことをテストするテストメソッドは、複数のassert
sを持つこともできます。
使用するのに適したパターンは、各テストケースに4つのフェーズがあることです。
assert
sを配置します。このパターンを使用する場合、複数のassert
sをverifyフェーズに配置することに問題はありません。これは、Gerard Meszaros著の本xUnit Test Patterns:Refactoring Test Codeで推奨されているアプローチです。
このパターンを最初の例にあるパターンと比較してください。
Eclipseはメソッドごとにユニットテストを生成しますが、これは合理的なアプローチのようです。テストしたメソッドが複雑すぎて1つのテストメソッドを使用してテストできない場合は、再ファクタリングすることを検討してください。
しかし、はるかに優れたアプローチは、TDDを使用して、設計と実装の残りの部分を推進するテストを事前に記述することです。
個人的には、Java Eclipseのコードカバレッジ http://www.eclemma.org とともに、メソッドごとに1つのテストを行うことを好みます。
ツールはあなたが実際にテストしているものを教えてくれます。