24.09.09

윤지현·2024년 9월 9일

TIL

목록 보기
59/75

단위 테스트란 무엇일까?


  • 테스트 코드란?
    • 소프트웨어의 코드가 예상한 대로 작동하는지 확인하기 위해 작성되는 코드
    • 테스트 코드를 작성한다면 프로그램의 버그를 사전에 발견하여 기하급수적인 비용의 증가가능성을 사전에 방
  • 개발자는 단위 테스트를 작성하여 프로그램을 테스트 할 수 있습니다.
    • 단위 테스트는 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지를 검사하는 테스트 기법
    • 단위 테스트는 빠르게 작성할 수 있고 문제 발생 시 어느 부분이 잘 못 되었는지를 빠르고 정확하게 확인할 수 있다는 장점

  • JUnit5 다루기
    • Before - After

      • @BeforeEach
        • 각각의 테스트 코드가 실행되기 전에 수행되는 메서드 생성
          @BeforeEach
          void setUp() {
              System.out.println("각각의 테스트 코드가 실행되기 전에 수행");
          }
      • @AfterEach
        • 각각의 테스트 코드가 실행된 후에 수행되는 메서드 생성
          @AfterEach
          void tearDown() {
              System.out.println("각각의 테스트 코드가 실행된 후에 수행\n");
          }
      • @BeforeAll
        • 모든 테스트 코드가 수행되기 전에 최초로 수행되는 메서드 생성
        • static 메서드로 만들어야 다.
          @BeforeAll
          static void beforeAll() {
              System.out.println("모든 테스트 코드가 실행되기 전에 초초로 수행\n");
          }
      • @AfterAll
        • 모든 테스트 코드가 수행된 후 마지막으로 수행되는 메서드 생성
        • static 메서드로 만들어야 다.
          @AfterAll
          static void afterAll() {
              System.out.println("모든 테스트 코드가 수행된 후 마지막으로 수행");
          }

  • 테스트 꾸미기
    • @DisplayName
      @Test
      @DisplayName("테스트의 내용을 한눈에 알아볼 수 있게 네이밍 해줄 수 있습니다.")
      void test1() {
          System.out.println("테스트의 수행 내용들을 빠르게 파악할 수 있습니다.");
      }
      • 테스트의 내용을 한눈에 알아볼 수 있게 네이밍
      • 테스트의 수행 내용들을 빠르게 파악
    • @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");
          }
      }
      • [코드 스니펫] @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");
            }
        }
      • 주제 별로 테스트를 그룹지어서 파악하기 좋다.
    • @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");
          }
      }
      • [코드 스니펫] @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) 애너테이션을 추가하고 () 괄호안에 순서를 입력

  • 테스트 반복하기
    • @RepeatedTest
      @RepeatedTest(value = 5, name = "반복 테스트 {currentRepetition} / {totalRepetitions}")
      void repeatTest(RepetitionInfo info) {
          System.out.println("테스트 반복 : " + info.getCurrentRepetition() + " / " + info.getTotalRepetitions());
      }
      • [코드 스니펫] @RepeatedTest
        @RepeatedTest(value = 5, name = "반복 테스트 {currentRepetition} / {totalRepetitions}")
        void repeatTest(RepetitionInfo info) {
            System.out.println("테스트 반복 : " + info.getCurrentRepetition() + " / " + info.getTotalRepetitions());
        }
      • @RepeatedTest를 사용하여 해당 테스트 메서드를 반복
      • name 속성을 사용하여 네이밍
      • RepetitionInfo 값을 파라미터로 받아서 현재 반복 횟수와 총 횟수 값을 확인
    • @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
        @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

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


profile
첫 시작

0개의 댓글