본문 바로가기
Spring_inflearn/입문

[Spring] inflearn 스프링 입문 - 스프링 DB 접근 기술 3

by clolee 2022. 9. 15.

스프링 통합 테스트

 

스프링을 올리고 db 연결해서 동작하는 통합 테스트

 

테스트케이스 - 필요한 것 injection 해서 쓰고 끝. 필드 injection 사용

구현체는 SpringConfig에서 올라옴

	@Autowired MemberService memberService;
	@Autowired MemberRepository memberRepository;

join test

db에 spring이 이미 존재

db 데이터 지우기

delete from member

 

다시 join 회원 가입 테스트 (@Transactional 주석처리)

spring을 띄우고 configuration이 올라옴. 테스트를 실행하고 테스트가 끝나면 spring이 내려감

 

테스트를 반복 할 수 있어야 함

다시 join 테스트 실행하면 오류. 이미 spring이 member에 있으므로.

 

데이터베이스는 transaction 개념이 있음

db에 data를 insert call 한 다음 commit 해줘야 db에 반영이 됨. 아니면 autocommit. 무조건 commit이 들어가야 함 

 

테스트 끝난 다음 rollback. rollback하면 db에서 data 없어짐.

그렇게 하는 방법 : @Transactional. @Transactional을 테스트케이스에 달면 테스트를 실행할 때 transaction을 먼저 실행하고 

db에 데이터를 insert query하고 findOne에서 검증, select 까지 다 한 다음에 테스트 끝나면 rollback 해줌. db에 넣은 데이터 다 지워짐

 

join 테스트 실행 후 데이터 확인 - 없음

테스트를 다시 시작해도 돌아감. 테스트 시작 전에 transaction을 걸고 db에 쿼리를 날림. 테스트가 끝날 때 그 데이터를 rollback. 반영 안 함.

transaction rollback 되기 때문에 db에 실제 데이터가 반영이 안 되어 있음 : 다음 테스트를 반복해서 실행할 수 있음

기존처럼 clear 하는 코드를 넣지 않아도 됨. 

 

전체 테스트 실행

 

@SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행. 스프링을 띄워서 테스트

@Transactional : 테스트케이스에 이 어노테이션이 있으면 테스트 시작 전에 트랜잭션을 시작하고 테스트 완료 후 항상 롤백.

테스트 각각 하나하나마다 적용됨. DB에 데이터가 남지 않아 다음 테스트 실행 가능. 다음 테스트에 영향 주지 않음.

Service 와 같은 다른 곳에 붙으면 롤백하지 않고 정상적으로 돔.

@Commit이 test 함수에 붙으면 커밋함.

 

단위 테스트 : 스프링 없이 하는 테스트. 순수한 자바코드로 최소한의 단위로 하는 테스트. 실행 시간 아주 짧음. 자바 뜨는 시간이 제일 김

통합테스트 : 스프링 컨테이너, DB 연동. 자바 뜨고, 스프링 띄우고 테스트 실행. 실행 시간 오래 걸림. 

 

순수한 단위테스트가 좋은 테스트일 확률이 높음.

스프링 컨테이너를 올려야 하는 상황이면 테스트 설계가 잘못되었을 확률이 높음

단위테스트를 잘 만드는 것이 좋은 테스트.

 

 

댓글