참고
테스트 - 데이터베이스 분리
NOTE
실제 데이터베이스를 연동해서 테스트를 하면 데이터베이스에 이미 과거에 서버를 실행하면서 저장했던 데이터가 보관되어 있기 떄문에 이 데이터가 현재 테스트에 영향을 준다.
•
이러한 문제를 해결하기 위해 테스트 전용 데이터베이스를 별도로 운영한다!
◦
jdbc:h2:tcp://localhost/~/test local에서 접근하는 서버 전용 데이터베이스
◦
jdbc:h2:tcp://localhost/~/testcase test 케이스에서 사용하는 전용 데이터베이스
테스트 - 트랜잭션 사용
NOTE
테스트에서 매우 중요한 원칙
•
테스트는 다른 테스트와 격리해야 한다
•
테스트는 반복해서 실행할 수 있어야 한다
•
테스트가 끝날 떄 마다 추가한 데이터에 DELETE SQL을 사용하는 방식도 있지만, 비정상적으로 종료되면, DELETE SQL을 호출하지 못할수도 있다
•
그래서 트랜잭션의 RollBack을 사용함!
데이터 롤백
//class ItemRepositoryTest
@Autowired
ItemRepository itemRepository;
//트랜잭션 관련 코드
@Autowired
PlatformTransactionManager transactionManager;
TransactionStatus status;
@BeforeEach
void beforeEach() {
//트랜잭션 시작
status = transactionManager.getTransaction(new DefaultTransactionDefinition());
}
@AfterEach
void afterEach() {
// ...
//트랜잭션 롤백
transactionManager.rollback(status);
}
Java
복사
•
@BeforeEach : 각 테스트가 시작하기전 트랜잭션을 시작한다
•
@AfterEach : 각 테스트가 종료되면 rollback 한다.
@Transactional
•
스프링은 테스트 데이터 초기화를 위해 트랜잭션을 적용하고 롤백하는 방식을 @Transactional 어노테이션으로 지원한다
앞선 코드의 롤백과 흐름이 동일함
@Transactional
@SpringBootTest
class ItemRepositoryTest {}
Java
복사
[ 참고]
•
강제로 커밋하기
◦
만약 rollback을 하지않고 commit을 하고싶다면 다음과 같이 작성한다
//@Rollback(value = false) // 1번 방법
@Commit // 2번 방법
@Transactional
@SpringBootTest
class ItemRepositoryTest {}
Java
복사