공부 자료:
웹 개발 실습 # 3
개발한 기능을 실행해서 테스트 해보자
개발한 기능을 실행해서 테스트할 때 main 메서드를 실행하거나
웹 어플리케이션의 컨트롤러를 통해 해당 기능을 실행하는 방법이 있다.
하지만 이 방법은 시간이 오래걸리고 반복 실행이 어렵고 여러 테스트를 한 번에 하기 어렵다는 쓰리 콤보 단점이 있다.
JUnit이라는 프레임워크를 통해 테스트를 실행하여 이 단점을 해결할 수 있다.
1. Test 패키지 및 클래스 생성
테스트할 구현체 이름 뒤에 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
문법: assertEquals(기댓값, 결과값)
(3) 방법 3: assertj.core.api.Assertions
static으로 import하였기 때문에
Assertions. 를 하지 않고 assertThat 만 쓰고 테스트 구문 시작 가능!
문법: assertThat(결과값).isEqualTo(기댓값);
사담
fluent 방식이다 = 영어 문장처럼 읽히는 문법이다
3. findByName( ) 메서드에 대한 Test 작성
3-1) 테스트 샘플 생성 : member 객체 2개 (member1의 name: spring ; member2의 name: summer)
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
설명: 내가 지금 작성한 코드의 반환 형태를 알려준다.
4-3) 테스트 결과 확인
리스트에 담긴 테스트 샘플의 크기와 기댓값 2와 같은지 확인
Test 작성 시 유의할점: 순서 비의존!
단위별로TEST를 돌리면 각각 Complete이 떴지만,
전체 TEST를 돌리자 findByName에서 error가 난다
그 이유는?
바로 테스트 순서 때문이다.
전체 테스트 클래스를 돌리게 되면
시스템에서 알아서 순서를 랜덤으로 실행하여 테스트를 실행한다.
테스트를 순서에 의존적으로 설계하면 안되는 것이다.
모든 테스트는 순서 상관없이 메서드별로 다 따로 동작하게 설계해야 한다.
그런데 전체 테스트를 돌리면서
findByName()을 하고나서 데이터가 2개 저장이 되고, save()를 통해 1개 저장되고
또 마지막으로 findAll()테스트 메서드에서 2개의 샘플이 추가로 저장되면서 5개의 데이터가
담겨져 있는 것이다.
한 테스트가 끝나고 나면 샘플 데이터(공용데이터)를 깔끔하게 삭제해주어야 한다 !
1. MemoryMemberRepository.java에 clear 메서드 추가
2. MemoryMemberRepositoryTest.java에 AfterEach 어노테이션으로 데이터 삭제 기능 추가
각 테스트 메서드 실행 후 (afterEach) clearStore()메서드가 실행된다.
3. 순서 상관없이 테스트 케이스를 설계했을 때 TestResult Complete
'자기발전소 > # JAVA' 카테고리의 다른 글
[JAVA] 배열 개념 정리: 배열 복사 arraycopy (0) | 2021.08.01 |
---|---|
Spring Boot 실습 2: Repository (0) | 2020.11.06 |
Spring Boot 실습 1: 비즈니스 로직 (0) | 2020.11.05 |
Spring 웹 개발 기초 (0) | 2020.11.05 |
Spring Boot 공부 기록 2 (0) | 2020.11.05 |