ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • @Transactional 롤백/커밋 테스트
    jpa/Spring Data JPA 2023. 7. 19. 17:46

    application프로퍼티에서 org.springframework 패키지를 debug로 잡으면 로그가 많이 남기때문에

    TransactionManager에 대해서만 debug로 잡고 테스트


    @Rollback(true)인 경우

    package study.hibernate.springdatajpa.transaction;
    
    import org.junit.jupiter.api.AfterAll;
    import org.junit.jupiter.api.AfterEach;
    import org.junit.jupiter.api.BeforeAll;
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    import org.junit.jupiter.api.TestInstance;
    import org.junit.jupiter.api.TestInstance.Lifecycle;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.ActiveProfiles;
    import org.springframework.test.context.transaction.AfterTransaction;
    import org.springframework.test.context.transaction.BeforeTransaction;
    import org.springframework.transaction.annotation.Transactional;
    
    import lombok.extern.slf4j.Slf4j;
    
    // @Rollback(true) 어노테이션이 붙은 것과 동일
    @SpringBootTest
    @Transactional
    @ActiveProfiles("test")
    @TestInstance(Lifecycle.PER_CLASS)
    @Slf4j
    public class TransactionTest {
    
    	@BeforeAll
    	void beforeAll() {
    		log.debug("=================================> @BeforeAll");
    	}
    
    	@BeforeTransaction
    	void beforeTransaction() {
    		log.debug("=================================> @BeforeTransaction");
    	}
    
    	@BeforeEach
    	void beforeEach() {
    		log.debug("=================================> @BeforeEach");
    	}
    
    	@AfterTransaction
    	void afterTransaction() {
    		log.debug("=================================> @AfterTransaction");
    	}
    
    	@AfterEach
    	void afterEach() {
    		log.debug("=================================> @AfterEach");
    	}
    
    	@AfterAll
    	void AfterAll() {
    		log.debug("=================================> @AfterAll");
    	}
    
    	@Test
    	void test1() {
    		log.debug("=================================> test1");
    	}
    
    	@Test
    	void test2() {
    		log.debug("=================================> test2");
    	}
    
    }

     

    각 테스트의 @BeforeEach 수행전 트랜잭션 시작 @AfterEach 종료시 트랜잭션 롤백


    @Rollback(false)인 경우

    @SpringBootTest
    @Transactional
    @ActiveProfiles("test")
    @Rollback(false)
    @TestInstance(Lifecycle.PER_CLASS)
    @Slf4j
    public class TransactionTest {

    각 테스트의 @BeforeEach 수행전 트랜잭션 시작 @AfterEach 종료시 트랜잭션 커밋


     

    @BeforeEach, @AfterEach 또한 각 테스트의 트랜잭션에 포함되기 때문에 각 테스트의 전후에 Transactional하지 않은 작업이 필요한 경우 @BeforeTransaction, @AfterTransaction이 붙은 메서드를 정의하여 Transaction과 관련되지 않은 작업을 진행시킨다.

     

    @BeforeAll, @AfterAll또한 Transactional하게 처리되지 않음

    댓글

Designed by Tistory.