Coding/Junit TEST
테스트 코드(@Test) 실행 후 데이터 rollback 수행 관리 (rollback 수행하기, rollback 수행하지않기)
shbada
2022. 3. 21. 17:29
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();
...
}
}
반응형