테스트 코드(@Test) 실행 후 데이터 rollback 수행 관리 (rollback 수행하기, rollback 수행하지않기)

반응형
728x90
반응형

상황

TEST 데이터를 저장하는 /test/saveTest API 테스트 코드를 작성한다.

@SpringBootTest
@AutoConfigureMockMvc
class SaveControllerTest {

    @Test
    @DisplayName("TEST 데이터 저장")
    void saveTest() throws Exception {
        /* param set */
        TestDto testDto = new TestDto();
        testDto.setName("test");
        
        MvcResult result = mockMvc.perform(post("/test/saveTest")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(toJson(rmVenParamDto)))
                .andExpect(status().isOk())
                .andReturn();
                
        ...
    }
}

 

테스트를 위해 TEST 테이블 데이터를 저장하는 saveTest API를 호출했다. 테스트 완료 후, 해당 데이터는 rollback 되어야한다.

 

 

@Transactional 어노테이션 추가

@SpringBootTest
@AutoConfigureMockMvc
class SaveControllerTest {

    @Test
    @DisplayName("TEST 데이터 저장")
    @Transactional // 테스트 완료 후 rollback
    void saveTest() throws Exception {
        /* param set */
        TestDto testDto = new TestDto();
        testDto.setName("test");
        
        MvcResult result = mockMvc.perform(post("/test/saveTest")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(toJson(rmVenParamDto)))
                .andExpect(status().isOk())
                .andReturn();
                
        ...
    }
}

 

결과를 확인해보면, Test 코드로 실행되어 저장된 데이터는 존재하지 않는다. 테스트 완료 직후 rollback 되어, 실제로는 저장되지 않았다.

 

로그를 확인해보면 아래와 같은 메시지가 보인다.

Rolled back transaction for test: [DefaultTestContext@76f7d241 testClass = ...

 

@Transactional은 테스트 케이스에 선언시 테스트 시작전에 트랜잭션을 시작하고, 테스트 완료 후 항상 롤백을 하여, 다음 테스트에 영향을 주지 않는다.

 

 

rollback false 지정

위와 반대로, rollback이 수행되지 않도록 설정할 수 있다.

 

Class 단위의 @Transactional 어노테이션을 선언했을 경우, 모든 메서드에 대해서 적용된다. 특정 메서드에서만 rollback 처리가 제외되도록 할 경우 사용하면 된다.

@SpringBootTest
@AutoConfigureMockMvc
@Transactional
class SaveControllerTest {

    @Test
    @DisplayName("TEST 데이터 저장")
    @Rollback(false) // rollback 되지 않도록 설정
    void saveTest() throws Exception {
        /* param set */
        TestDto testDto = new TestDto();
        testDto.setName("test");
        
        MvcResult result = mockMvc.perform(post("/test/saveTest")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(toJson(rmVenParamDto)))
                .andExpect(status().isOk())
                .andReturn();
                
        ...
    }
}

 

 

 

반응형

Designed by JB FACTORY