개발자가 가져야 할 좋은 습관 중 하나는 중복 코드 제거인데, 중복 코드는 프로그래밍의 가장 큰 적 중의 하나이다. 테스트 코드 또한 많은 중복이 발생한다. CalculatorTest 클래스에 Calculator 인스턴스를 생성하는 부분에 발생하는 중복을 제거한다.
import static org.junit.Assert.assertEquals;
import.org.junit.Test;
public class CalculatorTest {
private Calculator cal = new Calculator();
@Test
public void add() {
assertEquals(9, cal.add(6, 3));
}
@Test
public void subtract() {
assertEquals(3, cal.subtract(6, 3));
}
}
중복을 제거하는 것은 자바 문법에 아무런 문제가 없지만, JUnit은 테스트를 실행하기 위한 초기화 작업으로 위와 같이 구현하는 것을 추천하지 않는다. JUnit은 위 구현에 @Before 어노테이션을 활용을 추천한다.
import static org.junit.Assert.assertEquals;
import.org.junit.Before;
import.org.junit.Test;
public class CalculatorTest {
private Calculator cal;
@Before
public void setup() {
cal = new Calculator();
}
@Test
public void add() {
assertEquals(9, cal.add(6, 3));
}
@Test
public void subtract() {
assertEquals(3, cal.subtract(6, 3));
}
}
@Before 어노테이션을 사용하지 않고 필드(field)로 구현하는 방법 모두 각 단위 테스트를 실행할 때마다 Calculator 인스턴스를 생성하는 것은 같다. Calculator 인스턴스를 매 테스트마다 생성하는 이유는 add() 테스트 메서드를 실행할 때 Calculator의 상태 값이 변경되어 다음 테스트 메서드인 subtract() 테스트 메서드를 실행할 때 영향을 미칠 수 있기 때문이다. 테스트 메서드 간에 영향을 미칠 경우 테스트 실행 순서나 Calculator 상태 값에 따라 테스트가 성공하거나 실패할 수 있다.
그렇다면 왜 코딩량도 많고 구현 비용도 큰 @Before 어노테이션을 사용하는 방식을 추천할까? JUnit에는 @RunWith, @Rule 같은 어노테이션을 사용해 기능을 확장할 수 있는데, @Before 안이어야만 @RunWith, @Rule에서 초기화된 객체에 접근할 수 있다는 제약사항이 있기 때문이다. 따라서 가능한 @Before 어노테이션을 사용해 테스트 메서드에 대한 초기화 작업을 하는 것이 추후 문제 발생 가능성을 없앨 수 있다.
JUnit은 @Before 어노테이션을 제공해 초기화 작업을 하듯이 @After 어노테이션을 제공한다. @After 어노테이션은 메서드 실행이 끝난 후 실행됨으로써 후처리 작업을 담당한다. @Before, @After 어노테이션 실행 순서를 확인하기 위해 다음과 같이 구현한 코드를 실행한다.
import static org.junit.Assert.assertEquals;
import.org.junit.After;
import.org.junit.Before;
import.org.junit.Test;
public class CalculatorTest {
private Calculator cal;
@Before
public void setup() {
cal = new Calculator();
System.out.println("before");
}
@Test
public void add() {
assertEquals(9, cal.add(6, 3));
System.out.println("add");
}
@Test
public void subtract() {
assertEquals(3, cal.subtract(6, 3));
System.out.println("subtract");
}
@After
public void teardown() {
System.out.println("teardown");
}
}
실행 결과는 다음과 같다.
before
subtract
teardown
before
add
teardown
실행 결과를 보면 각 테스트 메서드가 실행될 때 매번 @Before, @After 어노테이션으로 설정한 메서드가 실행되면서 초기화와 후처리 작업을 하는 것을 확인할 수 있다. 이와 같이 매번 초기화, 후처리 작업을 통해 각 테스트 간에 영향을 미치지 않으면서 독립적인 실행이 가능하도록 지원한다.
JUnit에 대한 기본적인 사용법은 여기까지 끝이다. 지금까지 학습한 내용을 바탕으로 다음 절의 문자열 계산기를 JUnit으로 구현한다.
참고도서 : https://roadbook.co.kr/169
[신간안내] 자바 웹 프로그래밍 Next Step
● 저자: 박재성 ● 페이지: 480 ● 판형: 사륙배변형(172*225) ● 도수: 1도 ● 정가: 30,000원 ● 발행일: 2016년 9월 19일 ● ISBN: 978-89-97924-24-0 93000 [강컴] [교보] [반디] [알라딘] [예스24] [인터파크] [샘
roadbook.co.kr
'교재 실습 > 자바 웹 프로그래밍 Next Step' 카테고리의 다른 글
2.3.2 요구사항 분리 및 각 단계별 힌트 (3) | 2025.01.03 |
---|---|
2.3.1 요구사항 (0) | 2025.01.02 |
2.2.2 결과 값을 눈이 아닌 프로그램을 통해 자동화 (1) | 2024.05.06 |
2.2.1 한 번에 메서드 하나에만 집중 (0) | 2024.04.03 |
2.2 JUnit을 활용해 main() 메서드 문제점 극복 (0) | 2024.03.27 |
댓글