[내일배움캠프 Spring 4기] 73일차 TIL - 통합테스트 | @Transactional | @Rollback

서예진·2024년 3월 17일
0

오늘의 학습 키워드

통합테스트
@Transactional
@Rollback


통합테스트

통합테스트 장점

  • 모든 Bean을 올리고 테스트를 진행하기 때문에 쉽게 테스트 진행 가능
  • 모든 Bean을 올리고 테스트를 진행하기 때문에 운영환경과 가장 유사하게 테스트 가능
  • API 테스트할 경우 요청부터 응답까지 전체적인 테스트 진행 가능

통합테스트 단점

  • 모든 Bean을 올리고 테스트를 진행하기 때문에 테스트 시간이 오래걸림
  • 테스트의 단위가 크기 때문에 테스트 실패시 디버깅이 어려움
  • 외부 API 콜같은 Rollback 처리가 안되는 테스트 진행을 하기 어려움

Spring Boot를 이용한 통합 테스트

  • 통합 테스트
    • 여러 단위 테스트를 하나의 통합된 테스트로 수행
    • 단위 테스트 시 Spring은 동작되지 않음
  • @SpringBootTest
    • 스프링이 동작되도록 해주는 애너테이션
    • 테스트 수행시 스프링이 동작
      • Spring IoC/DI 기능을 사용 가능
      • Repository를 사용해 DB CRUD가 가능

Integration Test

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ApiApp.class)
@AutoConfigureMockMvc
@ActiveProfiles(TestProfile.TEST)
@Transactional
@Ignore
public class IntegrationTest {
@Autowired protected MockMvc mvc;
@Autowired protected ObjectMapper objectMapper;
...
}
  • 통합 테스트의 Base 클래스.
  • Base 클래스를 통해서 테스트 전략을 통일성 있게 가져갈 수 있다.
  • 통합 테스트는 주로 컨트롤러 테스트를 주로 하며 요청부터 응답까지의 전체 플로우를 테스트한다.
  • @ActiveProfiles(TestProfile.TEST) 설정으로 테스트에 profile을 지정한다. 환경 별로 properties 파일을 관리하듯이 test도 반드시 별도의 properies 파일로 관리하는 것이 바람직
  • @Transactional 트랜잭션 어노테이션을 추가하면 테스트코드의 데이터베이스 정보가 자동으로 Rollback 된다. 베이스 클래스에 이 속성을 추가 해야지 실수 없이 진행할 수 있다.
  • @Transactional 을 추가하면 자연스럽게 데이터베이스 상태의존적인 테스트를 자연스럽게 하지 않을 수 있게 된다.
  • 통합 테스트 시 필요한 기능들을 protected 로 제공해줄 수 있다. API 테스트를 주로 하게 되니 ObjectMapper 등을 제공해줄 수 있다. 유틸성 메서드들도 protected로 제공해주면 중복 코드 및 테스트 코드의 편의성이 높아진다.
  • 실제로 동작할 필요가 없으니 @Ignore 어노테이션을 추가한다.

Test Code

public class MemberApiTest extends IntegrationTest {
  • 이렇게 IntegerationTest 를 상속받아서 사용하면 된다.

통합테스트에서의 @Transactional, @Rollback

@SpringBootTest
@Transactional
@Rollback(value = false)
class ThreadRepositoryTest {
  • 통합테스트를 실행할 때, @SpringBootTest, @Transactional, @Rollback 이 적용된 것을 알 수 있다.
  • @Transactional@Rollback 어노테이션을 사용하는 이유는 테스트 케이스의 특정 동작을 제어하기 위함이다.

@Transactional

  • 트랜잭션을 시작하고 테스트 메서드가 실행되는 동안 해당 트랜잭션 내에서 수행된다.
  • 이 어노테이션을 사용하면 테스트 메서드가 실행될 때마다 데이터베이스 트랜잭션을 시작하고, 테스트가 완료되면 롤백한다.
  • 이를 통해 테스트 간의 데이터베이스 상태를 격리하여 테스트 간의 영향을 최소화할 수 있다.
  • 트랜잭션을 사용하지 않는 경우 테스트가 실행된 후에 데이터베이스에 남아있는 데이터를 수동으로 정리해야 할 수도 있다.

@Rollback

  • @Transactional 어노테이션과 함께 사용되는 경우 롤백 여부를 제어한다.
  • 기본적으로 @Transactional이 있을 때는 테스트 메서드가 완료되면 롤백된다. 그러나 @Rollback(false)로 설정하면 롤백되지 않고 영구적으로 변경된다.
  • 이를 사용하여 특정 테스트 메서드의 결과를 영속 데이터베이스에 유지하거나 롤백하여 이전 상태로 복원할 수 있다.
    따라서 테스트 클래스의 특정 메서드에서 @Transactional 및 @Rollback 어노테이션이 사용된 이유는 해당 메서드의 행위를 테스트하고, 테스트 이후에 데이터베이스 상태를 처리하기 위한 것이다.
profile
안녕하세요

0개의 댓글