23.04.08 TEST CODE 작성과 의미

Kuno17·2023년 4월 11일
0

TIL/WIL

목록 보기
33/38
post-thumbnail

TEST CODE란?

우선 왜 TEST CODE가 필요한지 이해가 필요했다.
처음 생각은 그냥 실행시켜서 포스트맨같은 프로그램으로 확인하는게 더 간단한 방법이 아닌가?

사용하는 이유

구글링을 통해 다른사람들이 생각하는 Test Code를 작성하는 이유를 검색하고 내가 생각하기에도 어느정도 동감하는 내용을 정리해봤다.

  • 개발 과정 중 예상치 못한 문제를 미리 발견가능하다.
  • 작성한 코드가 의도한 대로 작동하는지 검증이 가능하다.
  • 코드의 모듈화를 한번더 고민하게 해준다. (정말 객체지향적인가?)
  • 코드 리팩토링 시 기능 구현이 동일하게 되었다는 판단을 내릴 수 있다.
    ( 체감이 가능하다 변수값과 반환값이 동일하게 나오는지 검증이 가능하다 )

어떤 종류가 있는가?

✅ 단위 테스트(Unit Test)

단위 테스트(Unit Test)는 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트이다. 여기서 모듈은 애플리케이션에서 작동하는 하나의 기능 또는 메소드로 이해할 수 있다. 예를 들어 웹 애플리케이션에서 로그인 메소드에 대한 독립적인 테스트가 1개의 단위테스트가 될 수 있다.
즉, 단위 테스트는 애플리케이션을 구성하는 하나의 기능이 올바르게 동작하는지를 독립적으로 테스트하는 것으로, "어떤 기능이 실행되면 어떤 결과가 나온다" 정도로 테스트를 진행한다.

✅ 통합 테스트(Integration Test)

통합 테스트(Integration Test)는 모듈을 통합하는 과정에서 모듈 간의 호환성을 확인하기 위해 수행되는 테스트이다.

일반적으로 애플리케이션은 여러 개의 모듈들로 구성이 되고, 모듈들끼리 메세지를 주고 받으면서(함수 호출) 기능을 수행한다. 그렇기에 통합된 모듈들이 올바르게 연계되어 동작하는지 검증이 필요한데, 이러한 목적으로 진행되는 테스트가 통합 테스트이다. 그렇기에 통합 테스트는 독립적인 기능에 대한 테스트가 아니라 웹 페이지로부터 API를 호출하여 올바르게 동작하는 지를 확인하는 것이다.


작성해보기

처음 테스트 코드를 작성할때는 단위 테스트를 작성하려고 했으나 작성하고보니 통합테스트에 가까운 테스트를 하고 있었다.

우선 필요한 데이터를 만들어줄 필요가 있다.

    @BeforeEach
    public  void setUser() {
        String rawPassword = "12345678d@";
        loginRequestDto = new LoginRequestDto("rjsgh17@naver.com", rawPassword);
        User = new Member().builder()
                .email("rjsgh17@naver.com")
                .password(passwordEncoder.encode(rawPassword))
                .image(null)
                .nickname("USER")
                .loginType(LoginType.USER)
                .build();

@BeforeEach를 통해서 Test코드를 실행하기전에 미리 Mock데이터를 만들어놓는 개념이라고 생각한다.

이제 서비르 코드를 테스트하는 코드를 작성해 봤다.

   @Test
    @DisplayName("일반 유저 회원가입")
    void signup() {
        // given
        SignupRequestDto signupRequestDto = new SignupRequestDto(User);

        // when
        ApiResponseDto<SuccessResponse> apiResponseDto = memberService.signup(signupRequestDto);

        // then
        assertEquals(HttpStatus.OK.value() , apiResponseDto.getResponse().getStatus());
        assertEquals("회원가입 성공", apiResponseDto.getResponse().getMessage());
    }

SignupRequestDto를 만들어주고 이를 memberService에 있는 signup() 메서드를 실행시키고 그 결과를 받아아와 apiResponseDto에 넣어서 반환하는 로직이다.

마지막에
AssertEquals()메서드를 통해서 반환값과 예상값을 비교해서 내가 예측한 형식으로 결과가 잘 반환되는지 확인하는 로직이다.

단위테스트를 먼저 해야하는게 아닌가?

사실 작성하면서도 처음 의도한것은 단위테스트를 의도했으나 작성하다보니 그냥 통합테스트에 가까운 테스트 코드를 작성하고 있었다.
순수한 자바코드를 통해서 시험할 수 있는 단위테스트 역시 작성할 필요성을 강하게 느끼고 있다.

후기

처음에는 내가 작성한 서비스 코드에 테스트 코드를 맞춰서 끼워넣는다는 생각을 했지만 작성을 하고 리팩토링과 코드의 모듈화를 새롭게 생각해봃 수 있었다.

다음의 두가지 경험을 직접 해봤다.

  • 리팩토링을 진행했는대 테스트코드가 오류나는 경우
  • 테스트 코드를 위해서 내가 작성한 코드를 수정해야하는 상황이 발생한 경우

현재는 이 두가지 경우를 체감할 수 있었고 생각보다 시간이 오래걸리지만 필요성은 어느정도 체감할 수 있었다.

profile
자바 스터디 정리 - 하단 홈 버튼 참조.

0개의 댓글