본문 바로가기
  • 노션에서 삽질한 내용을 정리하는 블로그
자기발전소/# JAVA

Spring Boot 실습 3: Repository Test

by iamlucia 2020. 11. 6.

 

공부 자료: 

 

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다. 초급 프레임워크 및 라이브러리 웹 개발 Back-End Java Spring MVC Spring Boot 온라인 강의 백엔

www.inflearn.com

 

웹 개발 실습 # 3

개발한 기능을 실행해서 테스트 해보자


개발한 기능을 실행해서 테스트할 때 main 메서드를 실행하거나

웹 어플리케이션의 컨트롤러를 통해 해당 기능을 실행하는 방법이 있다.

하지만 이 방법은 시간이 오래걸리고 반복 실행이 어렵고 여러 테스트를 한 번에 하기 어렵다는 쓰리 콤보 단점이 있다.

 

JUnit이라는 프레임워크를 통해 테스트를 실행하여 이 단점을 해결할 수 있다. 

 

메모리 구현체에 대한 테스트를 작성해보자 
src/test/java/ 하위 폴더에 생성


1. Test 패키지 및 클래스 생성 

 

class MemoryMemberRepositoryTest 

 

테스트할 구현체 이름 뒤에 Test만 덧붙여 클래스 생성

이때, 다른 곳에서 가져다 쓸 것이 아니기 때문에 굳이 public이 아니어도 됨

 

2. save( ) 및 findById( ) 에 대한 Test 작성 

2-1) 테스트 샘플 생성 

 

 

2-2) 메서드 테스트

 

  (1) 테스트 샘플을 save() 메서드 store변수에 담기 

 

 

(2) 테스트 샘플을 findById()메서드로 꺼내오기

 

이 때 꺼내온 값은 Optional에 감싸져 있는데 

get()을 사용하여 Optional 껍데기를 한 번 까서 꺼내기 가능 

 

2-3) 테스트 결과 확인하기

 

  (1) 방법 1: System.out

 

 

실제값과 기댓값이 같은지 확인하여 

System.out.println() 출력값으로 다음과 같이  테스트 결과값을 콘솔에서 확인 가능하다. 

 

테스트 결과 화면 

 

 (2) 방법2 : Assertions

 

org.junit.jupiter.api.Assertions

문법: assertEquals(기댓값, 결과값)

 

테스트 통과 화면 

 

 (3) 방법 3: assertj.core.api.Assertions 

 

org.assertj.core.api.Assertions 를 static형식으로 선언

static으로 import하였기 때문에

Assertions. 를 하지 않고 assertThat 만 쓰고 테스트 구문 시작 가능! 

 

 

문법: assertThat(결과값).isEqualTo(기댓값); 

사담
fluent 방식이다 = 영어 문장처럼 읽히는 문법이다 

 

3. findByName( ) 메서드에 대한 Test 작성

3-1) 테스트 샘플 생성 : member 객체 2개 (member1의 name: spring ; member2의 name: summer)

 

동일한 형식을 복사한 다음 객체명만 바꿀 때 Shift+F6 단축키를 사용하여 한번에 수정 가능

 

 

3-2) 메서드 테스트

 

  (1) findByName() 메서드로 테스트 샘플 가져와서 결과값 변수 result에 담기 

 

 

3-3) 테스트 결과 확인 

 

 

4. findAll( ) 메서드에 대한 Test 케이스 작성

4-1) 테스트 샘플 생성 : member 객체 2개 (member1의 name: spring ; member2의 name: summer)

 

 

4-2) 메서드 테스트 

 

  (1) findAll( ) 메서드로 테스트 샘플들을 List에 담기

 

 

단축키: Ctrl + Alt + V 
설명: 내가 지금 작성한 코드의 반환 형태를 알려준다. 

Ctrl + Alt +V 단축키 사용 예시

 

4-3) 테스트 결과 확인 

 

리스트에 담긴 테스트 샘플의 크기와 기댓값 2와 같은지 확인

 


Test 작성 시  유의할점: 순서 비의존! 

 

단위별로TEST를 돌리면 각각 Complete이 떴지만, 

 

 

전체 TEST를 돌리자 findByName에서 error가 난다

 

그 이유는? 

 

바로 테스트 순서 때문이다. 

 

전체 테스트 클래스를 돌리게 되면

시스템에서 알아서 순서를 랜덤으로 실행하여 테스트를 실행한다.

테스트를 순서에 의존적으로 설계하면 안되는 것이다. 

 

모든 테스트는 순서 상관없이 메서드별로 다 따로 동작하게 설계해야 한다.

 

그런데 전체 테스트를 돌리면서 

findByName()을 하고나서 데이터가 2개 저장이 되고, save()를 통해 1개 저장되고 

또 마지막으로 findAll()테스트 메서드에서 2개의 샘플이 추가로 저장되면서 5개의 데이터가 

담겨져 있는 것이다.

 

한 테스트가 끝나고 나면 샘플 데이터(공용데이터)를 깔끔하게 삭제해주어야 한다 ! 

 

1. MemoryMemberRepository.java에 clear 메서드 추가 

 

MemoryMemberRepository.java

 

2. MemoryMemberRepositoryTest.java에 AfterEach 어노테이션으로 데이터 삭제 기능 추가 

 

각 테스트 메서드 실행 후 (afterEach) clearStore()메서드가 실행된다. 

 

 

3. 순서 상관없이 테스트 케이스를 설계했을 때 TestResult Complete