Saya telah menulis beberapa tes unit untuk beberapa kode baru di kantor, dan mengirimkannya untuk tinjauan kode. Salah satu rekan kerja saya membuat komentar tentang mengapa saya meletakkan variabel yang digunakan dalam sejumlah tes di luar ruang lingkup untuk tes.
Kode yang saya posting pada dasarnya
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";
}
Usulan perubahannya pada dasarnya
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)));
}
}
Di mana segala sesuatu yang diperlukan dalam ruang lingkup tes, didefinisikan dalam ruang lingkup tes.
Beberapa keuntungan yang ia perdebatkan adalah
- Setiap tes mandiri.
- Setiap tes dapat dieksekusi dalam isolasi, atau dalam agregasi, dengan hasil yang sama.
- Peninjau tidak harus menggulir ke mana pun parameter ini dideklarasikan untuk mencari nilainya.
Beberapa kelemahan dari metodenya yang saya katakan adalah
- Meningkatkan duplikasi kode
- Dapat menambahkan noise ke pikiran pengulas jika ada beberapa tes serupa dengan nilai yang berbeda ditentukan (mis. Tes dengan
doFoo(bar)
hasil dalam satu nilai, sementara panggilan yang sama memiliki hasil yang berbeda karenabar
didefinisikan berbeda dalam metode itu).
Selain dari konvensi, apakah ada kelebihan / kekurangan menggunakan metode yang lain?