Spring/Introduction to Spring

회원 도메인과 리포지토리 테스트

민철킹 2021. 2. 17. 20:54
  • 개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드를 통해서 실행하거나, 웹 애플리케이션의 컨트롤러를 통해서 해당 기능을 실행한다.
  • 이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어렵고 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다.
  • 자바는 JUnit이라는 프레임워크로 테스트를 실행해서 이러한 문제를 해결한다.

 


1. save() 메소드 테스트

1-1. 직접 출력해서 테스트하기

console창에 result = true로 뜬 것을 확인할 수 있다. ==> 테스트 성공

 

 

1-2. Assertions로 테스트하기

* junit

  • Junit에서 제공하는 Assertions 사용 ==> 테스트 성공

  • 테스트 실패시에는 다음과 같이 오류가 발생한다. Expected(기댓값, 우리가 찾는 값), Actual(실제 값)

* assertj

  • import static으로 Assertions을 가져오면 Assertions.assertThat을 assertThat만 적어 사용가능.
  • 테스트 성공

검증완료


2. findByName() 테스트

성공

 

- spring2를 member1과 비교할 때

오류를 출력해 테스트가 실패했음을 알 수 있다.

 

 

검증완료

 

 

3. findAll() 테스트

repository에 2명의 회원을 넣고, result의 size가 2인지 확인

 

 

 

 

 

4. 3가지 동시에 테스트

  • 테스트는 순서가 보장되어서는 안된다.
  • 테스트 실행 순서를 보면 맨 밑에 있는 findAll()이 가장 먼저 실행된 것을 볼 수 있다.
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);

Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);

findAll이 먼저 실행되면서 이미 위와 같이 repository에 저장되었기 때문에 오류가 발생하는 것이다.

 

이를 방지하기 위해 테스트가 한번 끝날 때마다 데이터들을 clear해줘야함

 

먼저, 미리 만들어두었던 구현체에 clear를 위한 메소드를 추가한다.

그 후, 테스트 클래스에 @AfterEach를 통해 clear 메소드를 실행시키면 된다.

  • @AfterEach는 하나의 테스트가 끝날 때마다 호출되어 실행된다. 콜백함수

==> 동시에 테스트를 진행하여도 성공한 것을 확인할 수 있다.

 

@AfterEach 

  • 한번에 여러 테스트를 실행하면 메모리 DB에 직전 테스트의 결과가 남을 수 있다.
  • 이렇게 되면 다음 이전 테스트 때문에 다음 테스트가 실패할 가능성이 있다.
  • @AfterEach 를 사용하면 각 테스트가 종료될 때 마다 이 기능을 실행한다.
  • 여기서는 메모리 DB에 저장된 데이터를 삭제한다.
  • 테스트는 각각 독립적으로 실행되어야 한다.
  • 테스트 순서에 의존관계가 있는 것은 좋은 테스트가 아니다.

 

 

핵심 : 테스트는 서로 의존성없이, 순서와 상관없이 설계되어야함.

 

* tdd

  • 테스트 주도 개발
  • 우리가 한 것과 반대로 테스트 클래스를 먼저 작성해놓고 이를 기반으로 구현을 하는 것.

 

반응형