04 스프링부트 3와 테스트

hyHA·2023년 12월 15일
0
post-custom-banner

테스트 코드는 작성한 코드가 의도대로 작동하는지, 혹은 예상치 못한 문제는 없는지 확인하기 위해 작성한다. 또한 코드를 수정했을 때 기존과 동일하게 동작하는지 확인하기 위해 작성한다.

스프링 부트 스타터 테스트

스프링 부트는 애플리케이션을 테스트하기 위한 도구와 애너테이션을 제공한다.
'스프링 부트 스타터 테스트'에 테스트를 위한 도구가 모여있다.

스프링 부트 스타터 테스트 목록은 아래와 같다.
이 중 JUnit과 AssertJ를 가장 많이 사용한다.

JUnit
Spring Test & Spring Boot Test
AssertJ
Hamcrest
Mockito
JSONNassert
JsonPath

JUnit

JUnit은 자바 언어를 위한 단위 테스트 프레임워크이다.

단위 테스트

작성한 코드가 의도대로 작동하는지 작은 단위로 검증하는 것. 단위는 보통 메서드가 된다.

특징

JUnit은 테스트끼리 영향을 주지 않도록 각 테스트를 실행할 때마다 테스트를 위한 실행 객체를 만들고 테스트가 종료되면 실행 객체를 삭제한다

JUnit은 사용법이 간단하고 무엇보다 테스트 결과가 직관적이라 좋다. 자세한 특징은 아래와 같다.

  1. 테스트 방식을 구분할 수 있는 애너테이션 제공
  2. @Test로 메서드 호출할 때마다 새 인스턴스를 생성, 독립 테스트 가능
  3. 예상 결과를 검증하는 어설션 메서드 제공
  4. 사용방법이 단순, 테스트 코드 작성 시간이 적음
  5. 자동 실행, 자체 결과를 확인하고 즉각적인 피드백을 제공

애너테이션과 메서드

@DisplayName

테스트 이름을 명시하는 애너테이션

@Test

테스트를 수행하는 메서드에 붙이는 애너테이션

검증 메서드

assertEquals(기대하는 값(a), 실제 검증할 값(b)) : a와 b 가 동일한지 확인

실행 순서 관련 애너테이션

애너테이션의미
@BeforeAll전체 테스트 시작 전 처음으로 한번만 실행
전체 테스트 실행 주기에서 한번만 호출됭어야 하므로 메서드는 static으로 선언해야
DB연결 등 테스트 환경 초기화
@BeforeEach테스트 케이스 시작 전 매번 실행
@AfterAll테스트 마치고 종료하기 전 한번만 실행
DB연결 종료하거나 공통적으로 사용하는 자원을 해제할 때
@AfterEach테스트 케이스 종료 전 매번 실행

AssertJ

AssertJ는 JUnit과 함께 사용되며 검증문의 가독성을 높여주는 라이브러리이다.
예를 들어, assertEquals()는 '기대하는 값'과 '실제 검증할 값'을 명시하지 않아 비교대상이 헷갈린다.

Assertions.assertEquals(sum, a+b);

이럴 때 AssertJ를 사용하면 'a와 b를 더한 값이 sum과 같아야 한다' 처럼 보다 더 명확하게 의미를 파악할 수 있다.

assertThat(a+b).isEqualTp(sum);
  • 자주 사용하는 메서드

MockMvc

애너테이션

@SpringBootTest

@SpringBootApplication(메인 애플리케이션 클래스에 추가하는 애너테이션)이 있는 클래스를 찾고 그 클래스에 포함되어 있는 빈을 찾은 다음 테스트용 애플리케이션 컨텍스트라는 것을 만든다.

테스트용 애플리케이션 컨텍스트란?

@AutoConfigureMockMvc

MockMvc를 생성하고 자동으로 구성하는 애너테이션. 애플리케이션을 서버에 배포하지 않아도 테스트용 MVC환경을 만들어 요청 및 전송, 응답 기능을 제공하는 유틸리티 클래스. 즉, 컨트롤러를 테스트할 때 사용되는 클래스.

@BeforeEach

테스트를 실행하기 전에 실행하는 메서드에 적용하는 애너테이션이다. 아래 예시처럼 MockMvc를 설정할 때 사용할 수 있다

@AfterEach

테스트를 실행한 후에 실행하는 메서드에 적용하는 애너테이션이다. 아래 예시처럼 테이블에 있는 데이터를 삭제할 때 사용할 수 있다.

@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();
  }
    

}

MockMvc를 활용한 로직 테스트

profile
룰루랄라
post-custom-banner

0개의 댓글