@Test
public void testAdd() {
Calculator calc = new Calculator();
assertEquals(5, calc.add(2, 3));
}
TDD는 먼저 테스트 코드를 작성하고 그 테스트를 통과하기 위한 최소한의 코드만을 작성하는 방식임.
코드의 품질을 높이고, 실제 필요한 코드만 작성하도록 유도함.
테스트 코드의 구조
// Given-When-Then 패턴
@Test
public void testCalculateTotalPrice() {
// Given
ShoppingCart cart = new ShoppingCart();
cart.addItem(new Item("Apple", 2));
// When
double total = cart.calculateTotalPrice();
// Then
assertEquals(2.0, total, 0.01);
}
테스트 코드도 생산 코드처럼 적절한 구조와 일관된 패턴을 따라 작성해야 함.
Given-When-Then 패턴처럼 테스트의 단계를 명확하게 나누어 가독성을 높이는 것이 중요함.
독립적인 테스트 유지
@Test
public void testAddMonths() {
DateCalculator dateCalc = new DateCalculator();
LocalDate result = dateCalc.addMonths(LocalDate.of(2023, 5, 31), 2);
assertEquals(LocalDate.of(2023, 7, 31), result);
}
각 테스트는 독립적이어야 하며, 서로의 실행 순서에 영향을 주지 않도록 작성되어야 함.
한 테스트의 실패가 다른 테스트에 영향을 미치지 않도록 해야 함.
깨끗한 테스트 코드의 필요성
@Test
public void testIsValidUser() {
User user = new User("John", "Doe");
assertTrue(user.isValid());
}
테스트 코드는 생산 코드만큼이나 중요하며, 가독성과 유지보수성을 고려한 깨끗한 코드가 되어야 함.
코드가 복잡할수록 테스트도 복잡해지므로, 코드 자체의 단순화를 위해서도 깨끗한 테스트 코드를 작성해야 함.
테스트 당 하나의 assert 문만 사용
@Test
public void testMultiply() {
Calculator calc = new Calculator();
assertEquals(6, calc.multiply(2, 3));
}
각 테스트는 하나의 검증(assert) 문만을 사용하여 해당 기능만을 확인하도록 해야 함.
여러 개의 검증 문을 사용하는 대신, 하나의 테스트가 하나의 기능을 검증하도록 유지하는 것이 테스트의 목적을 더 명확하게 함.
FIRST 원칙
@Test
public void testFirstPrinciples() {
// 빠르고 독립적인 테스트
assertTrue(someMethod());
}
assert 문을 활용한 효과적인 검증
@Test
public void testAssertEquals() {
int expected = 10;
int actual = Calculator.add(7, 3);
assertEquals(expected, actual);
}
[최애 TIL]
테스트에서 중복된 코드 제거
@Before
public void setUp() {
calculator = new Calculator();
}
@Test
public void testAddition() {
assertEquals(5, calculator.add(2, 3));
}