作業中の新しいコードの単体テストをいくつか作成し、コードレビューのために送りました。私の同僚の1人が、多くのテストで使用される変数をテストのスコープ外に配置した理由についてコメントしました。
私が投稿したコードは本質的に
import org.junit.Test;
public class FooUnitTests {
@Test
public void testConstructorWithValidName() {
new Foo(VALID_NAME);
}
@Test(expected = IllegalArgumentException.class)
public void testConstructorWithNullName() {
new Foo(null);
}
@Test(expected = IllegalArgumentException.class)
public void testConstructorWithZeroLengthName() {
new Foo("");
}
@Test(expected = IllegalArgumentException.class)
public void testConstructorWithLeadingAndTrailingWhitespaceInName() {
final String name = " " + VALID_NAME + " ";
final Foo foo = new Foo(name);
assertThat(foo.getName(), is(equalTo(VALID_NAME)));
}
private static final String VALID_NAME = "name";
}
彼の提案された変更は本質的に
import org.junit.Test;
public class FooUnitTests {
@Test
public void testConstructorWithValidName() {
final String name = "name";
final Foo foo = new Foo(name);
}
@Test(expected = IllegalArgumentException.class)
public void testConstructorWithNullName() {
final String name = null;
final Foo foo = new Foo(name);
}
@Test(expected = IllegalArgumentException.class)
public void testConstructorWithZeroLengthName() {
final String name = "";
final Foo foo = new Foo(name);
}
@Test(expected = IllegalArgumentException.class)
public void testConstructorWithLeadingAndTrailingWhitespaceInName() {
final String name = " name ";
final Foo foo = new Foo(name);
final String actual = foo.getName();
final String expected = "name";
assertThat(actual, is(equalTo(expected)));
}
}
どこにすべての試験の範囲内で必要とされ、テストの範囲内で定義されています。
彼が主張した利点のいくつかは
- 各テストは自己完結型です。
- 各テストは単独で、または集約して実行でき、同じ結果になります。
- レビューアーは、これらのパラメーターが宣言されている場所にスクロールして、値を調べる必要はありません。
私が主張した彼の方法の欠点のいくつかは
- コードの重複を増やす
- 異なる値が定義されている同様のテストが複数ある場合(つまり
doFoo(bar)
、同じ呼び出しがbar
そのメソッドで異なるように定義されているため、同じ呼び出しで異なる結果が得られる一方で、結果が1つの値である場合)、レビュー担当者の心にノイズを追加できます。
慣例は別として、どちらの方法を使用しても、他の方法に比べて他の利点/欠点はありますか?