테스트 코드 작성시 자주 사용되는 Given-When-Then 에 대해 알아보자.
given-when-then은 곧 - [준비 - 실행 - 검증] 이다.
given
테스트를 위해 준비를 하는 과정이다.
테스트에 사용하는 변수, 입력 값 등을 정의하거나, Mock 객체를 정의하는 구문도 given에 포함된다.
예시로 회원가입 테스트에 대해 알아보자.
//Given
Member member = new Member();
member.setName("hello");
멤버 객체를 정의하고 멤버의 이름을 hello라고 저장하였다.
when
실제로 액션을 하는 테스트를 실행하는 과정이다.
//When
Long saveId = memberService.join(member);
saveId에 멤버를 저장한다.
then
마지막은 테스트를 검증하는 과정이다.
예상한 값, 실제 실행을 통해서 나온 값을 검증한다.
//Then
Member findMember = memberRepository.findById(saveId).get();
assertEquals(member.getName(), findMember.getName());
리포지토리에서 saveId를 통해 조회한 findMember와 member의 비교를 하는 과정이다.
검증하는 메서드는 assertEqauls, assertThat 등 과 같은 경우가 있다.
single static import를 통해 test class를 쉽게 추가할 수 있다.
import static org.assertj.core.api.Assertions.*;
예시로 회원 리포지토리 테스트 케이스 작성
save()
@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);
}
findByName()
@Test
public void findByName() {
//given
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
//when
Member result = repository.findByName("spring1").get();
//then
assertThat(result).isEqualTo(member1);
}
findAll()
@Test
public void findAll() {
//given
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
//when
List<Member> result = repository.findAll();
//then
assertThat(result.size()).isEqualTo(2);
}
@AfterEach
public void afterEach() {
repository.clearStore();
}
@AfterEach 어노테이션
한번에 여러 테스트를 실행하면
메모리 DB에 직전 테스트의 결과가 남을 수 있다.
이렇게 되면 다음 이전 테스트 때문에 다음 테스트가 실패할 가능성이 있다.
@AfterEach 를 사용하면
각 테스트가 종료될 때 마다 이 기능을 실행한다.
여기서는 메모리 DB에 저장된 데이터를 삭제한다.
테스트는 각각 독립적으로 실행되어야 한다.
테스트 순서에 의존관계가 있는 것은 좋은 테스트가 아니다.
전체 테스트를 실행할 경우 오류가 뜨지만 @AfterEach 를 통해 직전 테스트의 결과를 삭제하여 오류를 막을 수 있다.
이를 통해 다른 @BeforeAll, @BeforeEach @AfterAll에 대해 알아보자
- @BeforeAll == @BeforeClass
- 테스트 클래스에 있는 어떤 테스트를 처음 실행하기 전 한 번만 실행된다.
- static으로 만들어져야 하며 리턴타입은 void이어야 함
- @BeforeEach == @Before
- 현재 클래스의 각 @Test, @RepeatedTest, @ParameterizedTest 또는 @TestFactory 메소드보다 먼저 메소드가 실행되어야 함을 의미
- 비즈니스 로직이 복잡해지고 테스트에 여러 초기화가 필요하다면 여러 개의 @BeforeEach 메소드를 만들 수 있다.
- 다만 초기화 메소드들 사이의 실행 순서는 보장되지 않으니 순서가 필요한 경우에는 @Order 어노테이션을 사용해 순서를 지정해준다.
- @AfterAll == @AfterClass
- 테스트 클래스에 있는 테스트를 모두 실행하고 그 후에 한 번만 실행된다.
- static으로 만들어져야 하며 리턴타입은 void이어야 함
- @AfterEach == @After
- 현재 클래스의 각 @Test, @RepeatedTest, @ParameterizedTest 또는 @TestFactory 메소드 이후에 메소드가 실행되어야 함을 의미
- 테스트가 실패해도 수행됨
보통 테스트 수준의 초기화면 @BeforeEach, @AfterEach로 충분하다.
'🍀Spring > 기본' 카테고리의 다른 글
[Spring] 예제 만들기 - 객체 지향 원리 적용 (0) | 2024.07.19 |
---|---|
[Spring] 예제 만들기 (0) | 2024.07.13 |
[Spring] 스프링이란? (0) | 2024.07.13 |
컴포넌트 스캔과 자동 의존관계 설정 (0) | 2024.07.06 |
스프링 웹 개발 기초 (0) | 2024.07.06 |