- 개발자들은 누구나 자신이 작성한 코드에 문제가 없음을 검증하기 위해 어떤 방법으로든 테스트 코드를 작성한다.
- 작성된 테스트 코드는 유지보수 과정에서 재사용되어 시스템의 안정성을 보장하는 중요한 장치가 된다.
- 대부분의 프로젝트에서는 JUnit을 기반으로 일관성 있는 단위 테스트를 진행하는데, 단위 테스트란 자신이 작성한 클래스에 대한 테스트로써 테스트 단계 중에서 가장 기본이라 할 수 있다.
- 단위 테스트가 효율적으로 이루어지기 위해서는 테스트할 객체가 최대한 단순해야 하지만 웹 애플리케이션은 테스트 대상 객체가 특정 서버와 관련되어 있거나 다른 객체들과 연관되어 관계가 복잡한 경우가 일반적이다.
- 예로 웹 애플리케이션에서 개발자가 만든 컨트롤러가 정상적으로 동작하는지 확인하기 위해서는 서블릿 컨테이너가 구동되어야 하고 브라우저를 통해 요청/응답 결과를 확인해야하지만, 컨트롤러를 수정할 때마다 매번 브라우저를 통해 결과를 확인하는 것은 여간 번거로운 일이 아니며, 서버가 완전히 구동될 때까지 테스트 결과를 확인할 수도 없다.
- 서버를 구동하지 않고 컨트롤러만 단독으로 테스트하거나 컨트롤러와 연관된 비즈니스 컴포넌트를 실행하지 않고 컨트롤러만 독립적으로 테스트할 수 있는 환경이 필요하다.
기본 테스트 클래스
@RunWith
- JUnit에서 기본으로 제공하는 Runner가 아닌 어노테이션에 정의된(위 코드에선 SpringRunner) 러너 클래스를 사용하기 위해서 추가한 것이다.
- 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킨다. 여기서는 SpringRunner라는 스프링 실행자를 사용한다.
- 스프링 부트 테스트와 JUnit 사이에 연결자 역할을 한다.
- 이 설정을 해야만 스프링 부트 기반의 테스트 케이스에서 가장 중요한 @SpringBootTest 어노테이션을 사용할 수 있다.
@SpringBootTest
- 메인 클래스에 선언된 @SpringBootApplication과 비슷한 어노테이션이라고 생각하면 된다.
- 테스트 케이스가 실행될 때 테스트에 필요한 모든 설정과 빈들을 자동으로 초기화하는 역할을 수행한다.
- 복잡한 테스트 설정들을 자동으로 처리하고, 테스트 관련 객체들도 메모리에 올리기 위해서 이 어노테이션을 선언한다.
속성 | 의미 |
properties | 테스트가 실행되기 전에 테스트에 사용할 프로퍼티들을 'key=value'형태로 추가하거나 properties 파일에 설정된 프로퍼티를 재정의한다. |
classes | 테스트할 클래스들을 등록한다. 만일 classes 속성을 생략하면 애플리케이션에 정의된 모든 빈을 생성한다. |
webEnvironment | 애플리케이션이 실행될 때 웹과 관련된 환경을 설정할 수 있다. |
외부 프로퍼티 사용하기
1) 프로퍼티 참조하기
- 테스트 케이스를 작성하다 보면 여러 테스트에서 공통으로 사용하는 데이터들이 있다.
- 공통된 데이터를 외부에 프로퍼티로 등록하면 테스트 데이터를 재사용하거나 변경하기가 쉽다.
- application.properties에 추가한 프로퍼티를 사용하기 위해서 Environment 객체를 의존성 주입하였다.
- Environment 객체를 이용하여 이름, 나이, 국가에 해당하는 프로퍼티 값을 출력하도록 테스트 케이스를 작성하였다.
- 프로퍼티 파일에 등록되지 않은 authour.nation을 제외한 이름, 나이에 해당하는 프로퍼티값이 잘 출력된다.
2) 프로퍼티 재정의하기
- @SpringBootTest를 이용하면 외부 프로퍼티 파일에 등록된 프로퍼티를 재정의할 수도 있고 새로운 프로퍼티를 추가할 수도 있다.
- 추가된 @SpringBootTeest 속성에서 classes는 테스트할 클래스를 지정할 때 사용한다.
- classes로 지정된 클래스는 컨테이너가 자동으로 메모리에 올린다. 하지만 classes에 등록되지 않은 클래스는 객체 생성되지 않기 때문에 테스트 과정에서 불필요한 메모리 낭비를 피할 수 있다.
- properties 속성을 이용해서 application.properties 파일에 설정된 외부 프로퍼티를 재정의하면서 동시에 author.nation이라는 새로운 퍼티도 추가하였다.
+ @SpringBootTest의 프로퍼티 중 value와 properties를 함께 사용할 수 없다.
'Java > SpringBoot' 카테고리의 다른 글
[SpringBoot] 그레이들 프로젝트를 스프링부트 프로젝트로 변경하기 (0) | 2020.03.27 |
---|---|
[SpringBoot] Test(2) MockMvc를 이용해서 테스트하기(@WebMvcTest, @AutoConfigureMockMvc) (3) | 2020.03.21 |
[SpringBoot] Starter로 의존성 관리하기 (0) | 2020.03.04 |
[SpringBoot] JPA(Java Persistence) 개념 정리 (0) | 2020.02.25 |
[SpringBoot] Springboot의 자동설정 (0) | 2020.02.21 |