티스토리 뷰
어제에 이어 회원 리포지토리에 작성한 사항을 테스트 해 볼수 있는 테스트 케이스를 작성해 보려고 한다.
개발한 기능을 실행해서 테스트를 할 때 자바의 main 메서드를 통해서 실행하거나, 웹 애플리케이션의 컨트롤러를 통해서 해당 기능을 실행한다.
이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어렵고 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다.
자바는 JUnit이라는 프레임워크로 테스트를 실행하서 이러한 문제를 해결한다.
우선 테스트는 기존의 main 경로가 아닌 test 경로에서 진행한다,
test 경로에 repository 폴더를 생성하고 MemoryMemberRepository를 테스트 하기 위한 MemoryMemberRepositoryTest 파일을 하나 생성해준다.
코드는 아래와 같이 우선 작성해준다.
package com.demoproject.demo.repository;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import com.demoproject.demo.domain.Member;
class MemoryMemberRepositoryTest {
MemberRepository repository = new MemoryMemberRepository();
@Test
public void save() {
Member member = new Member();
member.setName("spring");
repository.save(member);
Member result = repository.findById(member.getId()).get();
Assertions.assertEquals(result, member);
}
}
Junit에서 제공해주는 Test 어노테이션을 사용한다.
그러면 아래 코드를 실행할 수 있다.
Junit에서 제공하는 Assertions의 assertEquals를 사용해서 값이 같은지 확인할 수 있다.
값이 같다면 성공적으로 넘어가고 기대한 결과와 다를경우 에러를 내보내 준다.
실제로 실행을 하면 아래와 같이 성공 표시가 나타난다.
실패 할 경우는 아래와 같이 에러가 나타난다.
요즘에는 org.assertj에서 제공해주는 Assertions가 있는데 이 것이 좀 더 편하게 사용할 수 있다.
여기서 제공해 주는 assertThat을 사용하여 결과가 같은지 확인할 수 있다.
실무에서는 build Tool과 엮어서 build할 때 테스트 케이스를 통과하지 못하면 다음단계로 넘어가지 못하게 막아버리기도 한다.
다음으로 테스트를 이어나가 보자.
findByName 을 테스트 해보기 위해 다음과 같이 member 변수 두개를 생성한다.
@Test
public void findByName(){
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
Member result = repository.findByName("spring1").get();
assertThat(result).isEqualTo(member1);
}
이를 실행해 보면 다음과 같이 성공한 것을 볼 수 있다.
만일 실패했다면?
에러가 나타난다.
나머지 findAll도 테스트 해보자.
@Test
public void findAll() {
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
List<Member> result = repository.findAll();
assertThat(result.size()).isEqualTo(2);
}
소스는 위와 같이 작성하고, 실행시켜보면 성공한 것을 확인할 수 있다.
이제 모든 테스트 케이스를 작성하였으니 전체를 실행시켜 보자.
class 옆에 부분을 눌러 전체를 실행시켜 주면 된다.
그런데 실행을 시키면 findByName 부분에서 갑자기 에러가 나는것을 확인할 수 있다.
왜냐면 @Test를 돌릴 때는 Test의 순서가 보장이 안된다.
save, findByName, findAll 중 어떤게 가장 먼저 실행될지 모른다는 이야기이다.
이미 spring1으로 저장이 된 객체가 findByName에서 나오게 된 것이다.
그래서 test가 하나 끝나게 되면 데이터를 clear 해 주어야 한다.
그럼 MemoryMemberRepository에 test가 끝날 때마다 데이터를 clear 해주는 메서드를 하나 만들어 준다.
콜백 메서드라고 보면 된다. Test가 끝나면 항상 실행되도록 해준다.
MemoryMemberRepository에 store를 클리어 해 주도록 추가해준다.
public void clearStore(){
store.clear();
}
그리고 MemoryMemberRepositoryTest에 AfterEach 어노테이션을 사용하여 아래 부분을 추가해주고,
기존에 MemberRepository 인터페이스로 선언되었던 repository를 MemoryMemberRepository로 변경해 준다.
그리고 실행을 다시 시켜보면 모두 성공적으로 실행이 될 것이다.
모든 테스트는 서로 의존관계가 없이 이루어져야 하기 때문에 그러기 위해 하나의 테스트가 끝날 때, 저장소나 공용 데이터를 지워줘야 한다.
협업을 위해서는 테스트 코드를 꼭 작성하고 활용하는 습관을 들이도록 하자!
이상!
'Spring' 카테고리의 다른 글
[Spring] Spring 시작해보기 - 7. 회원 서비스 테스트하기 (0) | 2022.08.24 |
---|---|
[Spring] Spring 시작해보기 - 6. 회원 서비스 생성하기 (0) | 2022.08.23 |
[Spring] Spring 시작해보기 - 4. 회원관리 예제 만들기 (2) | 2022.08.21 |
[Spring] Spring 시작해보기 - 3. Spring 웹 개발 기초(2) (0) | 2022.08.19 |
[Spring] Spring 시작해보기 - 3. Spring 웹 개발 기초(1) (0) | 2022.08.18 |