[스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술] 10강
https://inf.run/hisy 강의를 수강하고 작성하는 게시물입니다.
1. 회원 리포지토리 테스트케이스 작성
(코드를 코드로 검증한다)
개발한 기능을 테스트 할때
- main 메서드를 통해 실행해서 확인
- 웹 애플리케이션의 컨트롤러를 통해 해당기능 실행
- 자바의 JUnit이라는 프레임워크로 테스트 실행
JUnit이라는 프레임워크를 사용하면 테스트 코드를 통해 준비하고 실행하기 단순해지고 여러 테스트를 한번에 실행하기 쉬워진다.
2. 테스트 패키지 제작
src-test-java-Hello.hellospring 밑에 repository 패키지를 만든다.
보통 테스트는 메인의 구조와 같게 만든다.
다른점은 테스트 하려는 클래스를 만들고 Test글자를 붙인다.
즉 MemoryMemberRepositoryTest라는 클래스를 만든다.
클래스는 다른곳에서 쓰지 않을 것이기 때문에 public으로 안해도 된다.(지움)
3. save 테스트
인스턴스를 생성하고
@Test를 앞에 붙이면 org.junit.jupiter.api를 불러온다.
save를 테스트 해볼 것이므로 public void save()를 입력하면 실행 할 수 있다.
왼쪽의 초록 삼각형을 누르면 Run할 수 있다.
package Hello.hellospring.repository;
import Hello.hellospring.domain.Member;
import org.junit.jupiter.api.Test;
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();
System.out.println("result = " + (result == member)) ;
}
}
member를 생성해서 spring이란 name으로 지정하여 레파지토리에 저장한다.
뜰어갔는지 검증하기 위해서 member의 이름이 레파지토리에 있는지 findById를 통해 검색하고 get을 통해 값을 던진다.
만약 잘 저장이 됐고 검색도 됐을경우 result와 member가 같을것이므로
result == member 는 True일 것이다. 그래서 True가 출력된다.
참고 soutv 를 누르면 아래 문구가 자동으로 나온다.
System.out.println("result = " + result);
3.1 테스트 결과 출력
True False라는 문자로 결과를 확인하는 것에는 한계가 있으므로 다른 api를 사용할 것이다.
3.1.1. Assertions org.junit.jupiter.api
Assertions를 입력하면 org.junit.jupiter.api가 있다.
Assertions.assertEquals(result, member);
위 소스는 두개가 같으므로 그냥 빌드가 된다.
만약 member대신 null을 입력하면 error가 발생한다.
3.1.2. Assertions org.assertj.core.api
Assertions를 입력하면 org.assertj.core.api도 존재한다.
Assertions.assertThat(member).isEqualTo(result);
위의 소스도 동일하게 동작한다.
Assertions에서 option+enter를 하면 static import할 수 있다.
소스 제일 위에 자동으로 입력이 되고
다음부터 Assertions라고 하면 바로 assertj의 Assertions를 쓸 수 있다.
4. findByName 테스트
@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();
Assertions.assertThat(result).isEqualTo(member1);
}
shift+f6을 입력하면 단어에 자동으로 블럭지정이 되면서 같은 단락의 같은 단어를 동시에 바꿀 수 있다.
member2 입력할때 3줄을 복사해서 member2만 복사하면 된다.
결과 검증 라인을 아래처럼 바꾼다면 거짓으로 빌드가 안될것이다.
Assertions.assertThat(result).isEqualTo(member2);
4.1. 여러개를 동시에 테스트
클래스 레벨에서 돌리거나
test- java - Hello.hellospring 을 우클릭하여 돌리면
단위 테스트가 가능하다.
5. findAll test
@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();
Assertions.assertThat(result.size()).isEqualTo(2);
}
결과 검증 라인을 아래처럼 바꾼다면 거짓으로 빌드가 안될것이다.
Assertions.assertThat(result.size()).isEqualTo(3);
5.1. 전체테스트 오류
전체테스트를 하면 갑자기 에러가 날 것이다.
테스트 순서가 임의로 진행이 된다.
즉, findAll 테스트에서 멤버를 저장하고 findByName 테스트에서 멤버를 또 저장했으므로 멤버수가 2개보다 많아져서 오류가 난다.
그래서 테스트를 할때마다 레파지토리를 깔끔하게 클리어를 해주어야 한다.
MemoryMemberRepository만 테스트 하는 것이므로
테스트 클래스 맨 위에 MemberRepository 인터페이스로 선언된 repository를 MemoryMemberRepository 형식으로 변경해준다.
MemoryMemberRepository repository = new MemoryMemberRepository();
main - java- Hello.hellospring- repository - MemoryMemberRepository.java
로 이동해서 맨 아래에 clearStore() 라는 함수를 만들어준다.
public void clearStore() {
store.clear();
}
store.clear()는 저장된것을 다 지워준다.
다시 테스트 클래스로 돌아와서 아래 코드를 repository 선언 밑에 넣어준다.
@AfterEach
public void afterEach() {
repository.clearStore();
}
@AfterEach는 매 매서드 마다 동작하는 명령이다.
즉, 테스트가 끝날때마다 repository를 비워준다.
6. 테스트에 대하여 부연설명
내가 A를 만든다고 할 때 미리 검증 틀을 만들어 놓고 만들어지면 틀에 맞춰지나 확인을 해보는 역순으로도 가능하다.
이것을 테스트 주도 개발 TDD라고 한다.
나중에 테스트가 수백 수천개가 될때 자동화가 될 수도 있다.
대형 프로젝트가 될 수록 테스트 코드없이 프로젝트가 만들어 질 수 없다.
꼭 테스트에 관하여 깊이있게 공부해야한다.
댓글 남기기