JUit
개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드를 통해서 실행하거나, 웹 애플리케이션의 컨트롤러를 통해서 해당 기능을 실행한다. 이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어렵고 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다. 자바는 JUnit이라는 프레임워크로 테스트를 실행해서 이러한 문제를 해결한다.
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
...
@AfterEach
public void afterEach() {
repository.clearStore();
}
@Test
public void save() {
//given
Member member = new Member();
member.setName("spring");
//when
repository.save(member);
//then
Member result = repository.findById(member.getId()).get();
assertThat(result).isEqualTo(member);
}
@Test
@Test 어노테이션을 붙이면 해당 메서드를 테스트 메서드로 인식한다.
@BeforeEach
현재 클래스의 각 테스트 시작 전에 실행하는 메서드.
@AfterEach
현재 클래스의 각 테스트 들이 종료된 후에 실행하는 메서드.
테스트가 실패해도 실행해야 한다. 여기서는 memory에 기록되는 repository 속 데이터를 지운다.
테스트는 독립적으로!
해당 강의에서는 findAll이 먼저 실행되고 그 다음에 findByName이 실행됐더니 오류가 났다.
테스트는 무작위 순서로 이루어지기 때문에 순서에 의존관계가 있는 것은 좋은 테스트가 아니다.
테스트는 각각 독립적으로 실행되어야 한다.
테스트 코드 작성 꿀팁
테스트는 정상 flow도 중요하지만 예외 flow가 훨씬 중요하다. 그 부분을 주의해서 작성하자.
또한 테스트를 given - when - then 문법으로 작성해보자. 훨씬 수월하다.
단위테스트와 통합테스트
간단히 정리하면 스프링 컨테이너를 올릴 필요없이 쪼개서 하는 테스트가 단위테스트.
스프링 컨테이너에 올려서 전체를 테스트 하는 통합테스트.
가급적 단위테스트로 쪼개서 하는 것이 바람직하다.
@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;
@Test
public void join() throws Exception {
//Given
Member member = new Member();
member.setName("hello");
//When
Long saveId = memberService.join(member);
//Then
Member findMember = memberRepository.findById(saveId).get();
assertEquals(member.getName(), findMember.getName());
}
@SpringBootTest
스프링 컨테이너와 테스트를 함께 실행한다.
@Transactional
테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.
'💻dev > 🌱Java+Spring' 카테고리의 다른 글
JPA | JPA란 무엇인가? (0) | 2023.04.27 |
---|---|
Java | 인터페이스(Interface)를 사용하는 이유와 예제 (0) | 2023.04.10 |
Java+Spring | 자바 빈(Java Beans)과 스프링 빈(Spring Bean)에 대해 알아보기 (0) | 2023.04.06 |
Spring | @ResponseBody, @RequestBody 어노테이션 알아보기 (0) | 2023.04.06 |
Spring | Java의 프레임워크 Spring 과 Spring Boot를 알아보자! (0) | 2023.04.05 |