테스트 코드는 작성한 코드가 의도대로 작동하는지, 혹은 예상치 못한 문제는 없는지 확인하기 위해 작성한다. 또한 코드를 수정했을 때 기존과 동일하게 동작하는지 확인하기 위해 작성한다.
스프링 부트는 애플리케이션을 테스트하기 위한 도구와 애너테이션을 제공한다.
'스프링 부트 스타터 테스트'에 테스트를 위한 도구가 모여있다.
스프링 부트 스타터 테스트 목록은 아래와 같다.
이 중 JUnit과 AssertJ를 가장 많이 사용한다.
JUnit
Spring Test & Spring Boot Test
AssertJ
Hamcrest
Mockito
JSONNassert
JsonPath
JUnit은 자바 언어를 위한 단위 테스트 프레임워크
이다.
작성한 코드가 의도대로 작동하는지 작은 단위로 검증하는 것. 단위는 보통 메서드
가 된다.
JUnit은 테스트끼리 영향을 주지 않도록 각 테스트를 실행할 때마다 테스트를 위한 실행 객체를 만들고 테스트가 종료되면 실행 객체를 삭제한다
JUnit은 사용법이 간단하고 무엇보다 테스트 결과가 직관적이라 좋다. 자세한 특징은 아래와 같다.
테스트 이름을 명시하는 애너테이션
테스트를 수행하는 메서드에 붙이는 애너테이션
assertEquals(기대하는 값(a), 실제 검증할 값(b)) : a와 b 가 동일한지 확인
애너테이션 | 의미 |
---|---|
@BeforeAll | 전체 테스트 시작 전 처음으로 한번만 실행 |
전체 테스트 실행 주기에서 한번만 호출됭어야 하므로 메서드는 static으로 선언해야 | |
DB연결 등 테스트 환경 초기화 | |
@BeforeEach | 테스트 케이스 시작 전 매번 실행 |
@AfterAll | 테스트 마치고 종료하기 전 한번만 실행 |
DB연결 종료하거나 공통적으로 사용하는 자원을 해제할 때 | |
@AfterEach | 테스트 케이스 종료 전 매번 실행 |
AssertJ는 JUnit과 함께 사용되며 검증문의 가독성을 높여주는 라이브러리이다.
예를 들어, assertEquals()는 '기대하는 값'과 '실제 검증할 값'을 명시하지 않아 비교대상이 헷갈린다.
Assertions.assertEquals(sum, a+b);
이럴 때 AssertJ를 사용하면 'a와 b를 더한 값이 sum과 같아야 한다' 처럼 보다 더 명확하게 의미를 파악할 수 있다.
assertThat(a+b).isEqualTp(sum);
@SpringBootApplication(메인 애플리케이션 클래스에 추가하는 애너테이션)이 있는 클래스를 찾고 그 클래스에 포함되어 있는 빈을 찾은 다음 테스트용 애플리케이션 컨텍스트
라는 것을 만든다.
테스트용 애플리케이션 컨텍스트란?
MockMvc를 생성하고 자동으로 구성하는 애너테이션. 애플리케이션을 서버에 배포하지 않아도 테스트용 MVC환경을 만들어 요청 및 전송, 응답 기능을 제공하는 유틸리티 클래스. 즉, 컨트롤러를 테스트할 때 사용되는 클래스.
테스트를 실행하기 전에 실행하는 메서드에 적용하는 애너테이션이다. 아래 예시처럼 MockMvc를 설정할 때 사용할 수 있다
테스트를 실행한 후에 실행하는 메서드에 적용하는 애너테이션이다. 아래 예시처럼 테이블에 있는 데이터를 삭제할 때 사용할 수 있다.
@AutoConfigureMockMvc
class TestControerTest{
@Autowired
protected MockMvc mockMvc;
@Autowired
private WebApplicationContext context;
@Autowired
private MemberRepository memberRepository;
@BeforeEach
public void mockMvcSetUp(){
this.mockMvc = MockMvcBuilders.webAppContextSetUp(context).build();
}
@AfterEach
public void cleanUp() {
memberRepository.deleteAll();
}
}