본문 바로가기

Java/Spring

Junit 테스트

TDD(테스트 주도 개발)에 앞서 가장 중요한 라이브러리 Junit을 공부하며 일단 간략하게 기록하고자 한다.

코드는 따로 없고 원리에 대해서만 기록한다.

 

스트링부트는 자체적으로 test 폴더를 구비하고 있다. 이 폴더 아래로 테스트 개발을 시작하면 된다.

코더가 작성한 클래스를 import 하여 상황 별 샘플 코드를 작성하여 테스트 한다.

 

Junit을 쓰는 이유는 main 메서드 작성 필요없이 간단하게 코드를 테스트 할 수 있기 때문이다.

 

단 문제점이 있다. 만일 같은 객체를 여러 테스트 메소드가 나누어 쓰게 되면 발생하는 문제이다. 

회원가입이 구성된 사이트의 Repository를 테스트 하기 위해 여러 테스트 메소드에 작성했다고 하자.

Repository에는 유저에 대한 정보를 담기 위해 save, delete 등 여러 메서드가 인터페이스 되어있다. 

이제 Repository에 있는 메서드를 테스트 하기 위해 test 어노테이션을 달은 새로운 임시 메소드를 작성한다.

Repository에는 Map 타입으로 된 store라는 객체가 있다. 따라서 키, 값 쌍을 이루는 객체이다.

이 store를 테스트 클래스에 전역변수로 선언하고 나머지 메서드들을 통해 유저 정보를 put을 해주어 새로운 회원은 save 등등 여러 기능들을 테스트 해본다.

 

여기서 문제가 발생하기 쉽다.

store 객체를 여러 테스트 메서드가 같이 사용하게 되는데, Junit 테스트의 경우 각 테스트 메서드의 실행 순서가 매번 다르다. 이게 왜 문제냐면 가령 회원을 전부 조회하는 findAll이라는 메서드를 먼저 사용하면 store에 있는 키, 또는 값을 조회하기 위해 임시의 유저 객체를 생성하여 store에 put 하고 해당하는 값이 있는지 찾는다. 그 다음 save 메서드를 테스트 하기 위해 똑같은 방식으로 임시의 유저 객체를 생성하고 store에 같은 값으로 put 하고, 동일한 Name 값이 있다면 save를 못하게 해야 하는데..

언급했듯 동일한 Map 타입의 store를 사용하기 때문에 키 데이터는 달라도 값 데이터가 동일하기 때문에 Junit은 혼동이 일어나는 것이다. 회원의 고유 식별자가 1, 2이고 Name은 동일한 이름으로 주었을 때가 바로 이 문제이다. 다른 유저 객체를 put 해주어도 값 데이터로 식별할 경우 말이다.

 

따라서 테스트 메서드의 실행이 끝나고 다음 테스트 메서드로 넘어가기 전에 repository를 한 번 clear 해주면 된다. 그러면 다음 테스트 메서드를 실행할 떄는 전에 사용했던 store 객체가 빈 상태로 있기 때문에 기능을 원활하게 테스트 할 수 있다.

 

'Java > Spring' 카테고리의 다른 글

Spring + MySQL 연동  (0) 2022.11.24
@RequestParam과 @PathVariable  (0) 2022.11.22
@ResponseBody  (0) 2022.11.03
@RequestParam  (0) 2022.11.03
GetMapping  (0) 2022.11.03