Tôi đã viết một số bài kiểm tra đơn vị cho một số mã mới tại nơi làm việc và đã gửi nó đi để xem xét mã. Một trong những đồng nghiệp của tôi đã đưa ra nhận xét về lý do tại sao tôi đặt các biến được sử dụng trong một số thử nghiệm ngoài phạm vi cho thử nghiệm.
Mã tôi đã đăng về cơ bản là
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";
}
Những thay đổi được đề xuất của ông về cơ bản là
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)));
}
}
Trong đó mọi thứ được yêu cầu trong phạm vi thử nghiệm, được xác định trong phạm vi thử nghiệm.
Một số lợi thế mà ông lập luận là
- Mỗi bài kiểm tra là khép kín.
- Mỗi thử nghiệm có thể được thực hiện trong sự cô lập, hoặc tổng hợp, với cùng một kết quả.
- Người kiểm tra không phải cuộn đến bất cứ nơi nào các tham số này được khai báo để tra cứu giá trị là gì.
Một số nhược điểm của phương pháp mà tôi lập luận là
- Tăng sao chép mã
- Có thể thêm nhiễu vào tâm trí người đánh giá nếu có một số thử nghiệm tương tự với các giá trị khác nhau được xác định (nghĩa là thử nghiệm với
doFoo(bar)
kết quả trong một giá trị, trong khi cùng một cuộc gọi có kết quả khác nhau vìbar
được định nghĩa khác nhau trong phương thức đó).
Ngoài quy ước, có bất kỳ lợi thế / bất lợi nào khác của việc sử dụng phương pháp này so với phương pháp khác không?