단위 테스트란?

금은체리·2023년 11월 29일
0

Spring

목록 보기
42/49

단위 테스트란?

버그 발견 시간이 늦어질수록 비용은 증가함

  1. Development: 개발
  2. Unit Tests(단위 테스트): 개발자 테스트
  3. QA Testing
    • 블랙박스 테스팅
    • 주로 QA 팀이 Production 환경과 유사한 환경(Stage)에서 테스팅
  4. Production: 실 서비스 운영 환경
    • 따라서 테스트 코드를 작성한다면 프로개름의 버그를 사전에 발견하여 기하급수적인 비용의 증가가능성을 사전에 방지 가능
  • 개발자는 단위 테스트를 작성하여 프로그램 테스트 가능
    • 단위 테스트는 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지 검사하는 테스트 기법
    • 단위 테스트는 빠르게 작성할 수 있고 문제 발생 시 어느 부분이 잘 못 되었는지를 빠르고 정확하게 확인할 수 있다는 장점 존재

JUnit5 다루기

  • JUnit5 : 자바 프로그래밍 언어 용 단위 테스트 프레임워크
  • @Before-After

    1. @BeforeEach
      @BeforeEach
      void setUp() {
          System.out.println("각각의 테스트 코드가 실행되기 전에 수행");
      }
      • 각각의 테스트 코드가 실행되기 전에 수행되는 메서드를 만들어 줌

    1. @AfterEach
      @AfterEach
      void tearDown() {
          System.out.println("각각의 테스트 코드가 실행된 후에 수행\n");
      }
      • 각각의 테스트 코드가 실행된 후에 수행되는 메서드를 만들어 줌

    1. @BeforeAll
      @BeforeAll
      static void beforeAll() {
          System.out.println("모든 테스트 코드가 실행되기 전에 최초로 수행\n");
      }
      • 모든 테스트 코드가 수행되기 전에 최초로 수행되는 메서드
      • static 메서드로 만들어야 함

    1. @AfterAll
      @AfterAll
      static void afterAll() {
          System.out.println("모든 테스트 코드가 수행된 후 마지막으로 수행");
      }
      • 모든 테스트 코드가 수행된 후 마지막으로 수행되는 메서드를 만들어 줌
      • static 메서드로 만들어야 함
  • 테스트 꾸미기

    1. @DisplayName
      @Test
      @DisplayName("테스트의 내용을 한눈에 알아볼 수 있게 네이밍 해줄 수 있습니다.")
      void test1() {
          System.out.println("테스트의 수행 내용들을 빠르게 파악할 수 있습니다.");
      }
      • 테스트의 내용을 한눈에 알아볼 수 있게 네이밍 해줄 수 있음
      • 테스트의 수행 내용들을 빠르게 파악 가능

    1. @Nested

      ```
      @Nested
      @DisplayName("주제 별로 테스트를 그룹지어서 파악하기 좋습니다.")
      class Test1 {
          @Test
          @DisplayName("Test1 - test1()")
          void test1() {
              System.out.println("Test1.test1");
          }
      
          @Test
          @DisplayName("Test1 - test2()")
          void test2() {
              System.out.println("Test1.test2");
          }
      }
      
      @Nested
      @DisplayName("Test2 다른 주제")
      class Test2 {
          @Test
          @DisplayName("Test2 - test1()")
          void test1() {
              System.out.println("Test2.test1");
          }
      
          @Test
          @DisplayName("Test2 - test2()")
          void test2() {
              System.out.println("Test2.test2");
          }
      }
      ```

      • 주제별로 테스트를 그룹지어서 파악하기 좋음

    1. @Order

      @Nested
      @DisplayName("주제 별로 테스트를 그룹지어서 파악하기 좋습니다.")
      @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
      class Test1 {
      
          @Order(1)
          @Test
          @DisplayName("Test1 클래스")
          void test() {
              System.out.println("\nTest1 클래스");
          }
      
          @Order(3)
          @Test
          @DisplayName("Test1 - test1()")
          void test1() {
              System.out.println("Test1.test1");
          }
      
          @Order(2)
          @Test
          @DisplayName("Test1 - test2()")
          void test2() {
              System.out.println("Test1.test2");
          }
      }

      • 테스트를 메서드 단위로 순서를 매길 때는 @TestMethodOrder(MethodOrderer.OrderAnnotation.class) 애너테이션 설정을 해야함
      • 그런 다음 원하는 순서에 맞게 메서드에 @Order(2) 애너테이션을 추가하고 () 괄호안에 순서입력
  • 테스트 반복하기

    1. @RepeatedTest
      @RepeatedTest(value = 5, name = "반복 테스트 {currentRepetition} / {totalRepetitions}")
      void repeatTest(RepetitionInfo info) {
          System.out.println("테스트 반복 : " + info.getCurrentRepetition() + " / " + info.getTotalRepetitions());
      }
      • @RepeatedTest를 사용하여 해당 테스트 메서드 반복 가능
      • name 속성을사용하여 네이밍 가능
      • RepetitionInfo 값을 파라미터로 받아서 현재 반복 횟수와 총 횟수 값 확인 가능

    1. @ParameterizedTest
      @DisplayName("파라미터 값 활용하여 테스트 하기")
      @ParameterizedTest
      @ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8, 9})
      void parameterTest(int num) {
          System.out.println("5 * num = " + 5 * num);
      }
      • @ParameterizedTest를 사용하여 파라미터를 받아 테스트할 수 있는 메서드를 만들 수 있음
      • @ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8, 9})를 사용하여 파라미터 값을 전달 할 수 있음
        • 전달되는 파라미터 수 만큼 테스트 메서드 수행
        • int, String 등 여러 타입의 파라미터 전달 가능
  • Given - When - Then

    • Given - When - Then 패턴은 Test Code 스타일을 표현하는 방식을 의미

    Given

    • 테스트 하고자하는 대상을 실제로 실행하기 전에 테스트에 필요한 값(상태)을 미리 선언해둠

    When

    • 테스트 하고자하는 대상을 실제로 실행 시킴

    Then

    • 어떤 특정한 행동(테스트 대상 실행) 때문에 발생할거라고 예상되는 결과에 대해 예측하고 맞는지 확인

참고

JUnit5 User Guide

profile
전 체리 알러지가 있어요!

0개의 댓글