이제 내가 만든 회원 리포지토리가 정상적으로 작동하는지 테스트 케이스를 만들어보자.
개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드를 통해 실행하거나, 웹 애플리케이션의 컨트롤러를 통해서 해당 기능을 실행할 수 있다. 그러나 이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어렵고, 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다. 자바는 JUnit이라는 프레임워크로 테스트를 실행해서 이러한 문제를 해결한다.
src/test/java 하위폴더에 생성한다.
1. @Test 어노테이션 달기
테스트 케이스의 메서드는 @Test를 달아서 테스트용이라는것을 알려준다.
2. save() 테스트하기
- member 객체를 하나생성한다.
- member객체에 setName으로 "spring"이라는 name을 하나 넣는다.
- repository의 save메서드로 member를 저장한다.
- repository의 findById메서드에 member에서 Id를 파라미터로 가져와 넣고 get()으로 가져온다음 result에 저장한다.
- result와 member를 비교해 같은지 확인한다.
3. findByName() 테스트하기
- member1 객체를 생성한다.
- member1 객체에 "spring1"이름을 넣는다.
- save()에 저장한다.
- 똑같이 member2를 만든다.
- findByName에 "spring1"을 넣고 가져와서 result에 저장한다.
- result와 member1가 같은지 확인한다.
- member2를 넣으면 실패하는걸 확인한다.
4. findAll() 테스트하기
- member1 객체를 생성후 "spring1"을 넣는다.
- 똑같이 member2를 만든다.
- result를 List객체로 만들고 findAll()을 넣는다.
- result의 size가 2인지 확인한다.
5. afterEach() 만들기
위의 테스트 케이스를 각자 실행하면 문제가 없지만, 다같이 실행하면 순서에 따라 "spring1"이 이미 만들어지기때문에 후에 실행되는 케이스는 오류가 뜬다. 따라서, 케이스가 실행되고 끝날때마다 clear해주는 메서드가 필요하다.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import java.util.List;
import java.util.Optional;
import static org.assertj.core.api.Assertions.*;
class MemoryMemberRepositoryTest {
MemoryMemberRepository repository = new MemoryMemberRepository();
@AfterEach
public void afterEach() {
repository.clearStore();
}
@Test
public void save() {
Member member = new Member();
member.setName("spring");
repository.save(member);
Member result = repository.findById(member.getId()).get();
assertThat(result).isEqualTo(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);
}
@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);
}
}
지금 한 방식은 먼저 개발을 한다음 테스트 케이스를 작성했는데, 반대로 테스트케이스를 먼저 만든다음 개발을 할 수도 있다. 이걸 TTD라고 한다.
지금은 개발내용이 많지않고, 혼자 개발하기때문에 테스트 케이스의 중요성이 높지 않아보이지만, 나중에 테스트 해야할 내용이 많아지거나 여러사람과 협업할경우 테스트코드가 없이 개발한다는건 사실상 불가능하다. 테스트케이스 없이 내가 작성한 코드가 잘 작동되는걸 확인하려면 main메서드를 매번 실행해서 확인해야하는데, 위에서 언급한것처럼 시간이 많이 소요되고 반복실행이 어렵기때문에 반드시 테스트케이스를 만드는걸 중요하게 여기자 !
'Spring Practice' 카테고리의 다른 글
DI란? (Dependency Injection) (0) | 2024.04.10 |
---|---|
[#9] Spring 파헤치기 : 회원 도메인과 리포지토리 만들기 (0) | 2022.03.02 |
[#8] Spring 파헤치기 : 회원 관리 예제(비즈니스 요구사항 정리) (0) | 2022.03.02 |
[#7] Spring 파헤치기 : API (0) | 2022.03.02 |
[#6] Spring 파헤치기 : MVC와 템플릿 엔진 (0) | 2022.02.25 |