스프링 프레임워크를 사용함으로써 단위테스트가 용이해진다는 것을 알고있다. 이는 다른 말로 해석해보면, 애플리케이션을 개발할 때는 단위테스트 작성이 중요하고, 스프링은 단위테스트를 지원하는 무엇인가를 제공하고 있다고 봐도 괜찮을 것이다.
이번 글에서는 스프링이 테스트를 어떻게 실행시키고, 어떤 보조 장치들이 있는지 간단히 살펴보자.
textcontextBootstrapper
가 호출되고 이는 테스트 프레임워크를 쉽게 실행시켜준다.TestContextManager
, TestContext
, TestExecutionListener
이다.TestContextBootstrapper?
TestContextBootstrapper는 Spring TestContext Framework를 Bootstrap하기 위한 SPI를 정의한다.
TestContextBootstrapper는TestContextManager
에서 현재 테스트에 대한TestExecutionListeners
를 가져오고 관리하는TestContext
를 빌드하는 데 사용됩니다.
@Test
어노테이션은 클래스 어노테이션을 확인하고 테스트 프레임워크의 TestContextManager
를 호출한다.TestContextManager
는 Test Pool을 전반적으로 관리하는 TestContext
를 띄우고, 이 컨텍스트는 실제 ApplicationContext를 띄우기 위해 ContextLoader
에 위임한다.TestExecutionListener
가 JUnit 생명주기에 맞춰 트랜잭션도 관리하면서, 테스트를 실행하게 된다.@Transactional
어노테이션을 지정하면 TestTransaction이 시작되고, 트랜잭션 종료 후 기본 전략이 Commit 이 아닌 Rollback으로 적용이 된다.TestExecutionListener
가 테스트에 사용되는 트랜잭션을 관리한다.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 생명주기에 맞춰 테스트를 실행하며, 트랜잭션을 관리하는 역할을 한다.