Spring Test

bp.chys·2020년 5월 17일
0

Spring Framework

목록 보기
7/15

Spring Test Framework

스프링 프레임워크를 사용함으로써 단위테스트가 용이해진다는 것을 알고있다. 이는 다른 말로 해석해보면, 애플리케이션을 개발할 때는 단위테스트 작성이 중요하고, 스프링은 단위테스트를 지원하는 무엇인가를 제공하고 있다고 봐도 괜찮을 것이다.

이번 글에서는 스프링이 테스트를 어떻게 실행시키고, 어떤 보조 장치들이 있는지 간단히 살펴보자.

Spring TestContext Framework

  • 테스트에서 스프링 빈을 사용하기 위해서는 ApplicationContext를 띄워야 한다.
  • 이는 다음 사진과 같이 SpringBoot 설정을 통해 자동으로 Spring TestContext Framework을 사용한다.
  • 테스트 프레임워크는 TextContext안에 ApplicationContext가 만든다.
  • 실제로 테스트를 실행하면, textcontextBootstrapper가 호출되고 이는 테스트 프레임워크를 쉽게 실행시켜준다.
  • 테스트 프레임워크를 이루는 핵심 요소는 TestContextManager, TestContext, TestExecutionListener 이다.

TestContextBootstrapper?

TestContextBootstrapper는 Spring TestContext Framework를 Bootstrap하기 위한 SPI를 정의한다.
TestContextBootstrapper는 TestContextManager에서 현재 테스트에 대한 TestExecutionListeners를 가져오고 관리하는 TestContext를 빌드하는 데 사용됩니다.

테스트 동작 방식

  1. 테스트를 실행하면 @Test 어노테이션은 클래스 어노테이션을 확인하고 테스트 프레임워크의 TestContextManager를 호출한다.
  2. TestContextManager는 Test Pool을 전반적으로 관리하는 TestContext를 띄우고, 이 컨텍스트는 실제 ApplicationContext를 띄우기 위해 ContextLoader에 위임한다.
  3. ApplicationContext가 완성되면, TestExecutionListener가 JUnit 생명주기에 맞춰 트랜잭션도 관리하면서, 테스트를 실행하게 된다.

테스트 트랜잭션

  • @Transactional 어노테이션을 지정하면 TestTransaction이 시작되고, 트랜잭션 종료 후 기본 전략이 Commit 이 아닌 Rollback으로 적용이 된다.
  • 테스트가 수행될 때 TestExecutionListener가 테스트에 사용되는 트랜잭션을 관리한다.
  • 테스트에 참여하는 Transaction은 총 3가지로, Test-Managed Transaction, Application-Managed Transaction, Spring-Managed Transaction 이 있다.
  • Test-Managed Transaction : TestTransaction을 통해 프로그래밍 방식으로 관리되는 트랜잭션
  • Spring-Managed Transaction : 테스트를 위해 로드 된 ApplicationContext 내에서 스프링에 의해 직접 관리되는 트랜잭션 ex) @Transactional
  • Application-Managed Transaction : 테스트를 통해 호출된 애플리케이션(프로덕션) 코드 내에서 프로그래밍 방식으로 관리되는 트랜잭션 ex)
@Autowired
private PlatformTransactionManager txManager;

public void logic() {

    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    TransactionStatus status = txManager.getTransaction(def);

    ....
    txManager.commit(status);
}

결론

스프링은 JUnit 프레임워크와 연동되어 테스트를 쉽게 작성할 수 있도록 Spring TestContext Framework를 사용한다. 이 테스트 프레임워크는 ApplicationContext를 띄우고, JUnit 생명주기에 맞춰 테스트를 실행하며, 트랜잭션을 관리하는 역할을 한다.

profile
하루에 한걸음씩, 꾸준히

0개의 댓글