[Spring Basic] JUnit Test Framework
개발 방법론 중 TDD (Test-Driven Development) 는 애플리케이션에 기능을 추가하기 전에 기능이 작동하는 테스트케이스를 먼저 작성하고 테스트를 통과하는 소스코드를 작성하는 방식의 개발 방법을 의미한다.
테스트를 먼저 추가하는 방식으로 개발해 견고한 코드를 작성할 수 있고 이후 추가로 기능을 개발했을 때 이미 작성한 테스트를 실행시켜 새로 개발한 기능에 Side Effect가 없는지 검증할 수 있다.
JUnit은 자바로 작성한 애플리케이션을 작은 단위로 나눠서 테스트 할 수 있게 해 주는 도구이다.
간단한 테스트는 자바로 비즈니스 로직 작성하듯 테스트 할 수 있지만 테스트 할 때 데이터베이스를 연동하고 여러 가지 무거운 객체들을 DI 받아야 하는 경우는 테스트를 가볍게 돌리기 위해 Mock 객체를 사용할 수 있다.
@SpringBootTest
@AutoConfigureMockMvc
public class ControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void webTest() throws Exception {
this.mockMvc.perform(get("/"))
.andExpect(status().isOk())
.andExpect(content().string("Hello World"));
}
}
MockMvc 객체를 주입받고 실제 웹에서 요청하는 것 처럼 테스트를 수행할 수 있다.
이후 assert를 통해 원하는 JSON 데이터가 반환됐는지 확인하는 방식으로 테스트를 수행한다.
HTTP 응답 메세지를 검증하는 방식으로 테스트를 수행할 수도 있다.
@SpringBootTest
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@Mock
UserRepository userRepository;
@InjectMocks
UserService userService;
@Test
@DisplayName("테스트1")
public void test() {
User mockUser = new User();
mockUser.setId(1);
mockUser.setName("asd");
mockUser.setEmail("asdf@naver.com");
when(userRepository.findById(1)).thenReturn(Optional.of(mockUser));
User user = userService.getUser(1);
assertEquals("asd", user.getName());
}
}
Mock 객체를 사용해 실제 데이터베이스에 의존하지 않고 Repository 계층을 사용해서 테스트 할 수 있다.
TDD의 일종으로 BDD (Behavior-Driven Development) 방식으로 개발하는 접근법이 있다.
클라이언트가 다른 시스템과 상호작용하면서 수행할 행동을 명확하게 정의하고 이를 테스트케이스로 변환해 개발하는 방식이다.
테스트를 작성하기 전 세 가지를 생각한다.
1. given
테스트를 시작하기 전의 초기 상태와 전제 조건을 정의한다.
ex. 회원 로그인 기능을 테스트하기 전 회원을 저장한다.
2. when
테스트에 대한 행동을 정의한다.
ex. 회원이 로그인한다.
3. then
행동 이후의 결과를 정의한다.
ex. 회원이 로그인 한 후의 상태를 테스트로 검증한다.
이런 형식으로 테스트를 작성해 테스트를 이해하기 쉽게 만들어주고 요구사항과 예상 결과를 명확하게 전달할 수 있다.
JUnit으로 테스트 시 테스트 편의를 위한 여러 애너테이션을 제공하니 필요에 따라 사용하자.
@BeforeClass : 테스트 클래스에서 한 번만 실행된다.
@Before : 각 테스트 메서드 실행 전에 실행된다.
@Ignore : 특정 테스트 메서드를 무시한다.
@AfterClass : 모든 테스트가 끝난 후 한 번만 실행된다.
@After : 각 테스트 메서드 실행 후에 실행된다.
@Mock : 테스트 대상 클래스의 의존 객체를 Mock 객체로 만든다.
@InjectMocks : @Mock으로 생성한 객체를 주입한다.
@DirtiesContext : 해당 애너테이션이 붙으면 스프링 컨테이너가 테스트를 실행할 때 마다 재시작해 캐싱 관련 이슈를 해결한다.
'Spring > Spring' 카테고리의 다른 글
[Spring Basic] MyBatis (0) | 2022.07.12 |
---|---|
[Spring Basic] DAO Repository DTO VO Entity (0) | 2022.07.09 |
[Spring Basic] 파라미터의 변환과 검증 (0) | 2022.06.24 |
[Spring Basic] DispatcherServlet (0) | 2022.06.23 |
[Spring Basic] 리다이렉트와 포워드 (0) | 2022.05.12 |
댓글
이 글 공유하기
다른 글
-
[Spring Basic] MyBatis
[Spring Basic] MyBatis
2022.07.12 -
[Spring Basic] DAO Repository DTO VO Entity
[Spring Basic] DAO Repository DTO VO Entity
2022.07.09 -
[Spring Basic] 파라미터의 변환과 검증
[Spring Basic] 파라미터의 변환과 검증
2022.06.24 -
[Spring Basic] DispatcherServlet
[Spring Basic] DispatcherServlet
2022.06.23