본문 바로가기

Java/SpringBoot

[SpringBoot] Test(1) 스프링 부트에서 테스트하기(@SpringBootTest)

- 개발자들은 누구나 자신이 작성한 코드에 문제가 없음을 검증하기 위해 어떤 방법으로든 테스트 코드를 작성한다.

- 작성된 테스트 코드는 유지보수 과정에서 재사용되어 시스템의 안정성을 보장하는 중요한 장치가 된다.

- 대부분의 프로젝트에서는 JUnit을 기반으로 일관성 있는 단위 테스트를 진행하는데, 단위 테스트란 자신이 작성한 클래스에 대한 테스트로써 테스트 단계 중에서 가장 기본이라 할 수 있다.

- 단위 테스트가 효율적으로 이루어지기 위해서는 테스트할 객체가 최대한 단순해야 하지만 웹 애플리케이션은 테스트 대상 객체가 특정 서버와 관련되어 있거나 다른 객체들과 연관되어 관계가 복잡한 경우가 일반적이다.

- 예로 웹 애플리케이션에서 개발자가 만든 컨트롤러가 정상적으로 동작하는지 확인하기 위해서는 서블릿 컨테이너가 구동되어야 하고 브라우저를 통해 요청/응답 결과를 확인해야하지만, 컨트롤러를 수정할 때마다 매번 브라우저를 통해 결과를 확인하는 것은 여간 번거로운 일이 아니며, 서버가 완전히 구동될 때까지 테스트 결과를 확인할 수도 없다.

- 서버를 구동하지 않고 컨트롤러만 단독으로 테스트하거나 컨트롤러와 연관된 비즈니스 컴포넌트를 실행하지 않고 컨트롤러만 독립적으로 테스트할 수 있는 환경이 필요하다.


기본 테스트 클래스

 

Spring Starter Project를 생성하면 pom.xml에 자동으로 test-start denpendency가 추가된다. 
src/java/test 폴더에 간단한 테스트 케이스를 제공한다.

@RunWith

- JUnit에서 기본으로 제공하는 Runner가 아닌 어노테이션에 정의된(위 코드에선 SpringRunner) 러너 클래스를 사용하기 위해서 추가한 것이다.

- 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킨다. 여기서는 SpringRunner라는 스프링 실행자를 사용한다.

- 스프링 부트 테스트와 JUnit 사이에 연결자 역할을 한다.

- 이 설정을 해야만 스프링 부트 기반의 테스트 케이스에서 가장 중요한 @SpringBootTest 어노테이션을 사용할 수 있다.

 

 

@SpringBootTest

- 메인 클래스에 선언된 @SpringBootApplication과 비슷한 어노테이션이라고 생각하면 된다.

- 테스트 케이스가 실행될 때 테스트에 필요한 모든 설정과 빈들을 자동으로 초기화하는 역할을 수행한다.

- 복잡한 테스트 설정들을 자동으로 처리하고, 테스트 관련 객체들도 메모리에 올리기 위해서 이 어노테이션을 선언한다.

 

속성 의미
properties  테스트가 실행되기 전에 테스트에 사용할 프로퍼티들을 'key=value'형태로 추가하거나 properties 파일에 설정된 프로퍼티를 재정의한다.
classes  테스트할 클래스들을 등록한다. 만일 classes 속성을 생략하면 애플리케이션에 정의된 모든 빈을 생성한다.
webEnvironment  애플리케이션이 실행될 때 웹과 관련된 환경을 설정할 수 있다.

 


외부 프로퍼티 사용하기

1) 프로퍼티 참조하기

- 테스트 케이스를 작성하다 보면 여러 테스트에서 공통으로 사용하는 데이터들이 있다.

- 공통된 데이터를 외부에 프로퍼티로 등록하면 테스트 데이터를 재사용하거나 변경하기가 쉽다.

 

application.properties에 추가
Test Class
실행 결과

- application.properties에 추가한 프로퍼티를 사용하기 위해서 Environment 객체를 의존성 주입하였다.

- Environment 객체를 이용하여 이름, 나이, 국가에 해당하는 프로퍼티 값을 출력하도록 테스트 케이스를 작성하였다.

- 프로퍼티 파일에 등록되지 않은 authour.nation을 제외한 이름, 나이에 해당하는 프로퍼티값이 잘 출력된다.

 

2) 프로퍼티 재정의하기

- @SpringBootTest를 이용하면 외부 프로퍼티 파일에 등록된 프로퍼티를 재정의할 수도 있고 새로운 프로퍼티를 추가할 수도 있다.

실행 결과

- 추가된 @SpringBootTeest 속성에서 classes는 테스트할 클래스를 지정할 때 사용한다.

- classes로 지정된 클래스는 컨테이너가 자동으로 메모리에 올린다. 하지만 classes에 등록되지 않은 클래스는 객체 생성되지 않기 때문에 테스트 과정에서 불필요한 메모리 낭비를 피할 수 있다.

- properties 속성을 이용해서 application.properties 파일에 설정된 외부 프로퍼티를 재정의하면서 동시에 author.nation이라는 새로운 퍼티도 추가하였다.

 

+ @SpringBootTest의 프로퍼티 중 value와 properties를 함께 사용할 수 없다.