이 영역을 누르면 첫 페이지로 이동
시간의화살 블로그의 첫 페이지로 이동

시간의화살

페이지 맨 위로 올라가기

시간의화살

행복하세요

[Spring Basic] JUnit Test Framework

  • 2022.07.09 09:27
  • Spring/Spring

 

 

 

개발 방법론 중 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

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [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
다른 글 더 둘러보기

정보

시간의화살 블로그의 첫 페이지로 이동

시간의화살

  • 시간의화살의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (590) N
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • Java (19)
      • C (25)
      • C++ (12)
      • JavaScript (15)
      • Python (1)
      • PHP (2)
    • Computer Science (53) N
      • System Programming (22)
      • Computer Architecture (4)
      • Computer Network (13)
      • Operating System (10) N
      • Universial Programming Lang.. (4)
    • Database (21)
      • MySQL (3)
      • Oracle (3)
      • Database (7)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Github Actions (0)
      • Amazon Web Service (8)
    • Machine Learning (28)
      • AI Introduction (28)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • FastAPI (3)
      • FastAPI (3)
    • Web (21)
      • HTML && CSS (14)
      • Web Scraping (7)
    • Solutions (13)
    • etc.. (1)
      • Notice (1)

최근 글

나의 외부 링크

메뉴

  • 홈

정보

13months의 시간의화살

시간의화살

13months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © 13months.

티스토리툴바