2장. 테스트

  • 출처: 토비의 스프링 3.1 vol.1 스프링의 이해와 원리

2.2 UserDaoTest 개선

테스트의 효율적인 수행과 결과 관리

JUnit은 자바 테스팅 프레임워크로, 단위 테스트 작성을 유용하게 도와준다.

@Test 어노테이션을 붙여 Junit에게 테스트용 메소드임을 알려주고, 메소드는 반드시 public void으로 선언되어야 한다.

public class UserDaoTest {
    @Test
    public void DaoTest() {
    }
}

각 테스트 메소드를 실행할 때마다 테스트 클래스의 오브젝트를 새로 만든다. 만약 하나의 테스트 클래스가 두 개의 테스트 메소드를 가지고 있다면, 테스트 실행 중 JUnit은 해당 클래스의 오브젝트를 두 번 만드는 것이다. 그리고 만약 해당 테스트 클래스에 @Before, @After 메소드가 있다면 테스트 메소드가 실행하기 전과 후에 각각 자동으로 수행된다.

즉, 테스트 수행 단계를 정리하면..

  1. 테스트 클래스에서 @Test가 붙은 public이고 void형이며 파라미터가 없는 테스트 메소드를 모두 찾는다.
  2. 테스트 클래스의 오브젝트를 하나 만든다.
  3. @Before가 붙은 메소드가 있으면 실행한다.
  4. @Test가 붙은 메소드를 하나 호출하고 테스트 결과를 저장해둔다.
  5. @After가 붙은 메소드가 있으면 실행한다.
  6. 나머지 테스트 메소드에 대해 2~5번을 반복한다.
  7. 모든 테스트의 결과를 종합해서 돌려준다.

2.4 스프링 테스트 적용

테스트를 위한 애플리케이션 컨텍스트 관리

스프링은 JUnit을 이용하는 테스트 컨텍스트 프레임워크를 제공한다. Junit의 테스트 컨텍스트를 이용하면 테스트에 필요한 애플리케이션 컨텍스트를 만들어서 모든 테스트가 공유할 수 있다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="/applicationContext.xml")
public class UserDaoTest {
    @Autowired
    private ApplicationContext context;
}

@RunWith는 Junit의 테스트 컨텍스트 실행 방법을 확장할 때 사용한다. @ContextConfiguration은 자동으로 생성하고 관리해줄 애플리케이션 컨텍스트의 설정 파일을 알려준다.

만약에 여러 개의 테스트 클래스에서 위와 같이 테스트 컨텍스트를 확장하고 같은 설정 파일로 설정해둔다 해도, 테스트 전체에 결쳐 단 한 개의 테스트 컨테스트만 만들어서 사용된다. (물론 설정 파일이 바뀐다면 그 때는 그 때는 다른 컨텍스트가 만들어진다)

물론 위의 예제처럼 반드시 테스트 컨텍스트를 적용해야만 DI를 구현할 수 있는 건 아니다. RunWith, AutoWired 없이도, @Before 메소드에서 직접 DI를 해주는 방법도 가능하다.

DI는 객체지향 프로그래밍 스타일이다. 따라서 DI를 위해 컨테이너가 반드시 필요한 것은 아니다. DI 컨테이너나 프레임워크는 DI를 편하게 적용하도록 도움을 줄 뿐, 컨테이너가 DI를 가능하게 해주는 것은 아니다. -본문 p195

DI를 이용한 테스트 방법 선택

그렇다면 어떤 테스트 방법이 더 좋은 걸까?

스피링 컨테이너 없이 테스트할 수 있는 방법을 가장 우선적으로 고려하자. 테스트 수행 속도가 가장 빠르고 테스트가 간결해진다.

여러 오브젝트와 관계를 맺는 오브젝트의 테스트라면, 스프링의 설정을 이용한 DI 방식이 좋다. 테스트 전용 컨텍스트 설정 파일을 만들고 개발 환경과 운영 환경을 분리한다.


"개인적으로 공부하면서 정리한 자료입니다. 오타와 잘못된 내용이 있을 수 있습니다."

좋은 웹페이지 즐겨찾기