본문 바로가기
교재 실습/자바 웹 프로그래밍 Next Step

2.2.3 테스트 중복 코드 제거

by Jint 2025. 1. 1.

개발자가 가져야 할 좋은 습관 중 하나는 중복 코드 제거인데, 중복 코드는 프로그래밍의 가장 큰 적 중의 하나이다. 테스트 코드 또한 많은 중복이 발생한다. 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

댓글