스프링부트3 테스트코드 작성

도람·2025년 6월 29일
post-thumbnail

테스트 코드 애너테이션

  • @BeforeAll: 전체 테스트를 시작하기 전 한 번만 실행.
    전체 테스트 주기 중 한 번만 호출되어야 하기 때문에 static으로 선언.
    ex) 데이터베이스 연결, 테스트 호나경 초기화

  • @BeforeEach: 테스트 케ㅔ이스를 시작하기 전에 매번 실행.
    ex) 객체 초기화, 테스트에 필요한 값을 미리 넣을 때 사용.

  • @AfterAll: 전체 테스트를 마치고 종료하기 전 한 번말 실행.
    전체 테스트 주기 중 한 번말 실행되어야 하기 때문에 static으로 선언.
    ex) 데이터베이스 연결 종료, 공통적으로 사용하는 자원 해제할 때 사용.

  • @AfterEach: 각 테스트 케이스를 종료하기 전 매번 실행.
    ex) 테스트 이후 특정 데이터를 삭제해야 하는 경우


AssertJ, JUnit

  • AssertJ와 JUnit은 테스트코드를 작성할 때 쓰는 라이브러리인데, 같이 사용하면 더 가독성 있게 테스트 코드를 작성할 수 있다.
Assertions.assertEqaul(a + b, sum)

예를 들어 이 코드를, assertj를 사용하면 다음과 같이 가독성 있게 작성할 수 있다.

assertThat(a + b).isEqualTo(sum)

테스트 코드 파일 쉽게 생성하기

  • 테스트 코드를 작성하고 싶은 클래스 위에 마우스 커서를 올려 놓고 Alt + Enter를 눌러 [createTest]를 누르면 해당 클래스의 테스트 파일이 자동으로 test/java/ 패키지 아래에 생성된다.

테스트 코드 예제

@SpringBootTest
@AutoConfigureMockMvc
class TestControllerTest {

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

    @DisplayName("getAllMembers: 아티클 조회에 성공한다.")
    @Test
    public void getAllMembers() throws Exception {
        // given
        final String url = "/test";
        Member savedMember = memberRepository.save(new Member(1L, "홍길동"));

        // when
        final ResultActions result = mockMvc.perform(get(url) // 1
                .accept(MediaType.APPLICATION_JSON)); // 2

        // then
        result
                .andExpect(status().isOk())
                .andExpect(jsonPath("$[0].id").value(savedMember.getId()))
                .andExpect(jsonPath("$[0].name").value(savedMember.getName()));
    }
}

사용 애너테이션

  • @SpringBootTest
    메인 애플리케이션 클래스에 추가하는 애너테이션인 @SpringBootApplication이 있는 클래스를 찾고, 그 클래스에 포함되어 있는 빈을 찾는다.
    그리고 테스트용 애플리케이션 컨텍스트라는 것을 만든다.
    ->테스트할 때 실제 애플리케이션과 유사한 빈들을 포함하는 컨텍스트를 사용할 수 있게 된다

  • @AutoConfigureMockMvc
    MockMvc를 생성하고 자동으로 구성하는 애너테이션이다.

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


  • @Autowired
    의존성 주입을 할 때 사용하는 Annotation으로, 의존 객체의 타입에 해당하는 bean을 찾아 주입하는 역할을 한다. 생성자, setter, 필드에 사용될 수 있다.

사용 클래스

  • ResultActions
    : Spring MVC의 테스트 프레임워크에서 제공되며, HTTP 요청에 대한 응답을 테스트하기 위한 메서드를 제공한다.
    이 클래스는 주로 MockMvc.perform() 메서드로부터 반환되고, 다양한 검증에 관한 메서드를 제공한다.

ㆍandExpect()
: 응답의 상태 코드, 내용, 헤더 등을 검증하는 데 사용된다.
ㆍ andDo()
: 테스트 실행 중에 추가 작업을 수행하는 데 사용된다. 예를 들어, 로그를 출력하거나 디버깅에 도움이 되는 정보를 수집하는 등의 작업을 수행할 수 있다.
ㆍandReturn()
: 컨트롤러 메서드가 반환한 객체나 데이터를 가져오는데 사용된다. 이를 통해 컨트롤러에서 반환한 객체를 테스트에서 활용할 수 있다.
ㆍandDo(print())
: 요청 및 응답의 내용을 콘솔에 출력하는 데 사용된다. 주로 디버깅 시 사용된다


  • perform()
    : MockMvc에서 제공되는 메서드로, 실제 HTTP 요청을 수행하는 역할을 한다.
    perform() 메서드의 인자에는 MockHttpServletRequestBuilder 객체가 들어가고, 이 객체는 MockMvc를 사용하여 수행할 HTTP 요청(post, get, put, delete, ...)을 나타낸다.

MockHttpServletRequestBuilder 제공 메서드
get(String url, ...)
post(String url, ...)
put(String url, ...)
delete(String url, ...)
각 메서드별로 URL, URL 매개변수, Query 매개변수 등을 인자로 줄 수 있다.

해당 글은 다음 도서의 내용을 정리하고 참고한 글임을 밝힙니다.
신선영, ⌜스프링 부트 3 벡엔드 개발자 되기 - 자바 편⌟, 골든래빗(주), 2023, 384쪽

profile
정도를 걷는 엔지니어

0개의 댓글