Spring 심화 1주차(1)

신성훈·2024년 6월 13일

TIL

목록 보기
37/162
post-thumbnail

오늘의 학습 키워드

  • 단위 테스트

단위 테스트

  • 개발자는 단위 테스트를 작성하여 프로그램을 테스트 할 수 있습니다.
    -단위 테스트는 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지를 검사하는 테스트 기법
    -단위 테스트는 빠르게 작성할 수 있고 문제 발생 시 어느 부분이 잘 못 되었는지를 빠르고 정확하게 확인할 수 있다는 장점

  • JUnit5 다루기
    -Before - After

    • @BeforeEach

      @BeforeEach
      void setUp() {
      	System.out.println("각각의 테스트 코드가 실행되기 전에 수행");
      }
    • @AfterEach

      @AfterEach
      void tearDown() {
      	System.out.println("각각의 테스트 코드가 실행된 후에 수행\n");
      }

      -각각의 테스트 코드가 실행된 후에 수행되는 메서드를 만들어 준다

    • @BeforeAll

      @BeforeAll
      static void beforeAll() {
      	System.out.println("모든 테스트 코드가 실행되기 전에 초초로 수행\n");
      }
      

      -모든 테스트 코드가 수행되기 전에 최초로 수행되는 메서드를 만들어 줍니다.
      -static 메서드로 만들어야합니다

    • @AfterAll

      @AfterAll
      static void afterAll() {
      	System.out.println("모든 테스트 코드가 수행된 후 마지막으로 수행");
      }
      

      -모든 테스트 코드가 수행된 후 마지막으로 수행되는 메서드를 만들어 줍니다.
      -static 메서드로 만들어야합니다.

  • 테스트 꾸미기

    • @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");
      	}
      }

      -주제 별로 테스트를 그룹지어서 파악하기 좋다.

    • @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를 사용하여 해당 테스트 메서드를 반복할 수 있다.
      -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를 사용하여 파라미터를 받아 테스트할 수 있는 메서드를 만들 수 있다.
      -@ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8, 9})를 사용하여 파라미터 값을 전달 할 수 있다.
      -> 전달되는 파라미터 수 만큼 테스트 메서드가 수행된다.
      -> int, String 등 여러 타입의 파라미터를 전달할 수 있다.

  • Assertions

  1. assertEquals()
    -메서드는 첫 번째 파라미터에 예상값을 넣고 두 번째 파라미터에 테스트 결과값(실제값)을 넣어준다.
    -예상값과 실제값이 다르면 테스트가 실패한다.
    -파라미터 값에 람다식으로 메시지를 넣어두면 테스트 실패 시 해당 메시지가 출력된다.
    ( new Supplier<String>() )

  2. Assertions.assertTrue(boolean)
    -assertTrue() 메서드는 해당 파라미터 값이 true인지 확인한다.

  3. Assertions.assertNotNull(actual)
    -assertNotNull() 메서드는 해당 파라미터 값이 null이 아님을 확인한다.

  4. Assertions.assertThrows(expectedType, executable)
    -assertThrows() 메서드는 첫 번째 파라미터에 예상하는 Exception 클래스 타입을 넣고 두 번째 파라미터에 실행 코드를 넣으면 된다.
    -실행 코드의 결과가 예상한 해당 클래스 타입이라면 테스트에 성공

  • Given - When - Then
    Given
    -테스트 하고자하는 대상을 실제로 실행하기 전에 테스트에 필요한 값(상태)을 미리 선언한다.

When
-테스트 하고자하는 대상을 실제로 실행 시킨다.

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

class CalculatorTest {

    Calculator calculator;

    @BeforeEach
    void setUp() {
        calculator = new Calculator();
    }

    @Test
    @DisplayName("계산기 연산 성공 테스트")
    void test1() {
        // given
        int num1 = 5;
        String op = "/";
        int num2 = 2;

        // when
        Double result = calculator.operate(num1, op, num2);

        // then
        assertNotNull(result);
        assertEquals(2.5, result);
    }

    @Test
    @DisplayName("계산기 연산 실패 테스트 : 분모가 0일 경우")
    void test1_1() {
        // given
        int num1 = 5;
        String op = "/";
        int num2 = 0;

        // when
        Double result = calculator.operate(num1, op, num2);

        // then
        assertNull(result);
    }

    @Test
    @DisplayName("계산기 연산 실패 테스트 : 연산자가 잘못됐을 경우")
    void test1_2() {
        // given
        int num1 = 5;
        String op = "?";
        int num2 = 2;

        // when - then
        IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> calculator.operate(5, "?", 2));
        assertEquals("잘못된 연산자입니다.", exception.getMessage());
    }
}
profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글