TDD vs 단위 테스트(Unit Test)
TDD: 테스트가 주도하는 개발을 의미함. 테스트 코드를 먼저 작성하는 것부터 시작.
Unit Test: TDD의 첫번째 단계인 기능 단위의 테스트 코드를 작성하는 것을 의미함. 순수하게 테스트 코드만 작성하는 것을 의미함.
단위 테스트 없는 개발 방식.
코드작성-> 프로그램 실행-> API 테스트 도구로 HTTP 요청-> 요청 결과를 System.out.println()으로 눈으로 검증-> 결과가 다르면 다시 프로그램(Tomcat)을 중지하고 코드 수정
2~5번을 매번 코드를 수정할 때마다 반복해야 하는 단점 존재!
테스트 코드 작성을 통해 사람이 눈으로 검증하지 않고 자동검증이 가능해짐.
개발자가 만든 기능을 안전하게 보호해줌.
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 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(member).isEqualTo(result);
}
@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);
}
}
@AfterEach : 한번에 여러 테스트를 실행하면 메모리 DB에 직전 테스트의 결과가 남을 수 있다. 이를 해결하기 위해 사용.
findAll()을 통해 이미 spring1의 이름을 가진 객체가 생성되었는데 findByName()에서 또 생성하니 DB에 남아있던 테스트 DB가 문제를 일으킴.
@AfterEach /* 이를 통해서 테스트가 끝날때마다 DB를 clear시킨다 */
public void afterEach(){
repository.clearStore();
}
순서에 상관 없이 잘 작동하는 것 확인 가능!