개발 상황에서 테스트의 중요성을 부인할 사람은 없을 것이라 생각합니다.
그것도 처음부터 자잘하게 꾸준히 테스트하는 게 나중에 생각해보면 시간을 많이 절약해주죠.
이 포스트에서는 간단하게 Junit에 대해 다룹니다.
Junit은 클래스의 제어권한을 넘겨받아 어플리케이션의 흐름을 제어하는 프레임워크입니다.
테스트에서 Junit 프레임워크가 요구하는 조건은 두가지입니다.
메소드가 public이로 사용되어야하고, @Test 라는 어노테이션이 붙어야합니다.
Junit은 어노테이션을 적극적으로 활용하죠.
1번의 @Runwith은 Junit의 기능을 확장해서 스프링과 관련된 기능을 사용하게끔 해주는 어노테이션입니다.
모든 클래스는 클래스의 작업을 실행해주는 main 클래스가 있습니다. Junit의 경우 그 main 클래스를 러너 클래스라고 부르는데
테스트 코드를 이 러너클래스에서 돌려서 테스트를 진행하게 됩니다.
이 때 테스트 도중 스프링과 관련된 기능의 확장, 어플리케이션 컨텍스트 생성 관리 등의 작업을 도와줍니다.
그 아래 @ContextConfiguration은 테스트 클래스가 자동으로 만들고 운영하는 어플리케이션 컨텍스트의 위치 주소입니다.
저 주소에 애플리케이션 컨텍스트의 설정파일을 만들게 됩니다.
이 정보는 생략할 수도 있습니다. 생략 시에는 테스트 클래스가 속한 패키지 내부에 아래와 같이 자동으로 생성/조회 합니다.
jTest-context.xml
jtest-context.xml
이렇게 관리되어 만들어진 어플리케이션 컨텍스트 값은 2번의 @Autowired 어노테이션이 붙은 ApplicationContext 클래스에 자동으로 주입됩니다.
테스트 프레임워크에서 @Autowired가 붙은 인스턴스가 있으면 탐지 후 주입해줍니다.
어노테이션이 없으면
ApplicationContext context = new ApplicationContext("applicationContext.xml");
이렇게 적어줘야할 코드를 자동으로 주입해 주는 것입니다.
어플리케이션 컨텍스트는 빈이 아니지만, 스프링 어플리케이션 컨텍스트는 초기화 할 때 자기자신도 빈으로 등록합니다.
따라서 어플리케이션 컨텍스트에는 ApplicationContext 타입의 빈이 존재하는 것입니다.
이런 어노테이션 방식으로 어플리케이션 컨텍스트를 사용한다면, 테스트 클래스가 몇개이든 단 하나의 설정파일을 공유하고
사용하게 됩니다. 때문에 효율성 측면에서도 좋습니다.
3번의 @Before는 @Test 이전에 실행되는 메소드입니다.
주요 테스트를 하기 전에 한번 거쳐가는 메소드이죠. 같은 원리로 @After는 @Test 이후에 실행되는 메소드입니다.
4번은 테스트 Junit은 @Test가 붙은 메소드를 실행할 때마다 테스트 오브젝트를 하나씩 만들어냅니다.
저 예제코드에서는 @Test 가 두개인데, 그러면 테스트 오브젝트가 두개 만들어지게 됩니다.
즉, 예제코드에서 테스트가 이루어진다면
@Before -> 첫번째 @Test -> @After -> @Before -> 두번째 @Test -> @After |
이런 식으로 이루어지게 되겠죠.
만약 테스트 중에 익셉션이 뜨게 되면 어떻게 될까요? 테스트는 돌발상황을 감지하고 중단되고 죽어버릴 것입니다.
우리가 당연히 에러가 날 상황을 예상하고 테스트 하더라도, 죽어버리겠죠.
이런 경우를 생각하기 위해
두번째 예제코드의 @Test에서는 (expected=...) 형식으로 익셉션 클래스를 정의하고 있습니다.
예제코드에서는 널 익셉션이 정의되었는데 이런 경우 널 익셉션이면 죽지 않고 테스트가 진행됩니다.
'프로그래밍 > Web-Spring' 카테고리의 다른 글
JDBC 트랜잭션과 트랜잭션 추상화 (Transaction, Abstraction of Transaction) (0) | 2018.02.10 |
---|---|
Spring - 파일 업로드 하기 (1) | 2017.11.27 |
Spring에서 mybatis 사용법 (0) | 2017.11.25 |