Back-Language/Java

[Spring] 테스트 케이스 given - when - then 패턴

200scs 2024. 7. 9. 09:25

Spring 프레임워크로 개발할 때, 테스트 케이스 작성은 중요합니다. 테스트 케이스는 우리가 작성한 코드가 의도한 대로 동작하는지 확인해주니까요. 이번 포스팅에서는 Spring에서 자주 사용하는 given - when - then 구조에 대해 알아보겠습니다.

given - 뭔가가 주어졌을 때

테스트 케이스 작성의 첫 번째 단계는 given입니다. 이 단계에서는 테스트에 필요한 사전 조건이나 준비 작업을 설정합니다. 주어진 조건이 무엇인지 명확히 정의하고, 테스트에 필요한 데이터를 설정합니다. 예를 들어, 데이터베이스에 특정 값이 있어야 하거나, 특정 객체가 특정 상태여야 하는 경우 등이 여기에 해당하죠.

// given - 사전 조건 설정 
User user = new User(); 
user.setName("John Doe"); 
user.setEmail("john.doe@example.com"); 
userRepository.save(user);

when - 이걸로 실행했을 때

두 번째 단계는 when입니다. 이 단계에서는 테스트하고자 하는 동작이나 이벤트를 실행합니다. 주어진 조건하에서 특정 메서드를 호출하거나 이벤트를 발생시키죠. 이때, when 단계에서 발생하는 동작이 테스트의 핵심이 됩니다.

// when - 테스트 동작 실행 
User foundUser = userService.findUserByEmail("john.doe@example.com");

then - 이게 나와야 해!

마지막 단계는 then입니다. 이 단계에서는 when에서 실행된 동작의 결과를 검증합니다. 예상한 결과와 실제 결과를 비교해서 테스트가 성공했는지 확인하는 거죠. 예상한 값이 제대로 반환되었는지, 특정 예외가 발생했는지 등을 체크합니다.

// then - 결과 검증 
assertNotNull(foundUser); 
assertEquals("John Doe", foundUser.getName()); 
assertEquals("john.doe@example.com", foundUser.getEmail());

예제: Spring 테스트 케이스 작성

이제 given - when - then 구조를 활용한 Spring 테스트 케이스의 전체 예제를 보겠습니다. 아래 예제는 간단한 UserService를 테스트하는 케이스입니다.

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class UserServiceTest {      
    @Autowired     
    private UserService userService;     
    @Autowired     
    private UserRepository userRepository;      
    @Before    
    public void setUp() {         
        userRepository.deleteAll();     
    }      
    @Test     
    public void testFindUserByEmail() {         
        // given         
        User user = new User();         
        user.setName("John Doe");         
        user.setEmail("john.doe@example.com");         
        userRepository.save(user);          
        // when         
        User foundUser = userService.findUserByEmail("john.doe@example.com");         
        // then         
        assertNotNull(foundUser);         
        assertEquals("John Doe", foundUser.getName());         
        assertEquals("john.doe@example.com", foundUser.getEmail());     
        } 
}

위의 예제에서는 @Before 애노테이션을 사용해 매 테스트 실행 전 데이터베이스를 초기화합니다.
testFindUserByEmail 메서드는 given - when - then 구조를 사용해 UserService의 findUserByEmail 메서드를 테스트합니다.

이 구조를 사용하면 테스트 케이스가 읽기 쉽고, 명확하게 구성되어 유지보수하기도 편리합니다. 테스트 케이스를 작성할 때 given - when - then 구조를 한 번 활용해 보세요! 이 구조는 마치 "이것이 주어졌을 때, 이렇게 했더니, 이 결과가 나왔다"는 식의 스토리텔링 같아서 더 이해하기 쉽고 재미있습니다.