본 게시물은 인프런 '스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술' 강의를 듣고 개인 공부용으로 작성하였습니다.
개발한 기능을 실행해서 테스트 할때 자바의 main메서드를 통해서 실행하거나, 웹 애플리케이션의 컨트롤러를 통해서 해당 기능을 실행한다. 이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어렵고 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다. 자바는 JUnit이라는 프레임 워크로 테스트를 실행해서 이러한 문제를 해결한다
자바에서 독립된 Unit Test를 지원해주는 프레임워크로 assert메서드로 테스트 케이스의 수행결과를 판별한다. @Test, @Before, @After 같은 지원 어노테이션을 제공하며 @Test 메서드가 호출될때 마다 새로운 인스턴스를 생성하여 독립적인 테스트가 이루어진다.
테스트 클래스는 반드시 public으로 선언해야한다 클래스명은 관례상 테스트 클래스명+Test로 끝나느 이름을 사용한다. @Test 어노테이션을 선언한 메서드는 JUnit이 알아서 실행한다.
src 폴더 안에는 main폴더와 test 폴더가 있는데, main폴더의 java파일에 우리가 테스트하고싶은 컨트롤러나 리포지토리가 있고, test폴더에 새로운 패키지를 만들어 Test클래스를 작성한다.
test>java>hello.hellospring에 main과 같이 repository를 만들고 클래스명+Test 클래스 만들기.
✔MemoryMemberRepositoryTest.java
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
class MemoryMemberRepositoryTest {
MemberRepository respository =new MemoryMemberRepository();
@Test //save함수를 실행가능하게 한다
public void save() {
Member member =new Member();
member.setName("스프링");
respository.save(member);
//optional에서 값을 꺼낼때 get()을 쓰는데, test에서 쓰는게 좋다.
Member result = respository.findById(member.getId()).get();
//expect하는 member와 actual 실제 가져온 result가 같은지 확인.
Assertions.assertEquals(member,result); //org.junit.jupiter.api 의 Assertions이다
}
@Test
public void findByName(){
Member member1 = new Member();
member1.setName("spring1");
respository.save(member1);
Member member2 = new Member();
member2.setName("spring2 ");
respository.save(member2);
Member result = respository.findByName("spring1").get();
assertThat(result).isEqualTo(member1);
}
}
직관적으로 알기 쉽게 assertThat()을 Equals보다 많이 사용하는데 that은 org.assertj.core.api.Assertions 안에 있다. 둘다 아래와 같이 쓸수 있다.
import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;
~~
assertEquals(member,null);
assertThat(member).isEqualTo(result);
save함수 왼쪽에 초록 ▶을 누르면 성공 시
실패시
class 왼쪽에 초록 ▶을 누르면 class 전체를 test 할 수 있다.
객체를 생성할 때 내용은 같고 숫자만 다른 여러 객체를 만드려면 복붙하고 shift+f6을 누르고 숫자변경을 해주면된다.
test 순서는 보장이 되지않는다. 모든 test는 메소드 상관없이 따로 동작하도록 설계해야한다. 따라서 테스트가 한번 끝나면 데이터를 clear해줘야한다.
✔MemoryMemberRepositoryTest.java
@AfterEach
public void afterEach(){
respository.clearStore();
}
리포지토리 객체 생성후 적어준다.(이때 리포지토리를 클릭후 컨트롤+B를 누르면 바로 import한 파일로 갈수있다!)
✔MemoryMemberRepository.java
public void clearStore(){
store.clear();
코드를 class 마지막에 적어준다.
개발 먼저하고 testcase를 만들수 있고 testclass를 먼저 작성하고 개발을 할수도 있다. 검증할 수 있는 틀을 먼저 만든다고 생각하면 된다.