내일배움캠프 Spring 39일차 TIL

Skadi·2024년 2월 19일
0

스프링 심화

1. 단위 테스트

1-1 개발자는 단위 테스트를 작성하여 프로그램을 테스트 할 수 있습니다.

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

1-2 @BeforeEach

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

1-3 @AfterEach

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

1-4 @BeforeAll

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

1-5 @AfterAll

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

1-6 @DisplayName

  • 테스트의 내용을 한눈에 알아보기 쉽게 이름을 지을 수 있습니다.
  • 테스트 내용을 쉽게 파악할 수 있습니다.
@Test
@DisplayName("테스트의 내용을 한눈에 알아보기 쉽게 이름을 지을 수 있습니다.)
void test1(){
	System.out.println("테스트 내용을 쉽게 파악할 수 있습니다.");
}

1-7 @Nested & @Order

  • @Nested : 주제 별로 테스트를 그룹지어서 파악하기 좋습니다.
  • @Order : 테스트를 메서드 단위로 순서 매길 때는
    - @TestMethodOrder(MethodOrderer.OrderAnnotation.class) 애너테이션 설정을 해야합니다
    • 그런 다음 원하는 순서에 맞게 메서드에 @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");
        }

    }

    @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-8 @RepeatedTest

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

1-9 ParameterizedTest

  • @ParameterizedTest를 사용하여 파라미터를 받아 테스트 할 수 있는 메서드를 만들 수 있습니다.
  • @ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8, 9})를 이용하여 파라미터 값을 전달 할 수 있습니다.
    @DisplayName("파라미터 값 활용하여 테스트 하기")
    @ParameterizedTest
    @ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8, 9})
    void parameterTest(int num) {
        System.out.println("5 * num = " + 5 * num);
    }

1-10 Assertions

  • Assertions.assertEquals(expected, actual)
    - assertEquals() 메서드는 첫 번째 파라미터에 예상값을 넣고 번째 파라미터에 테스트 결과값 (실제값)을 넣어줍니다
    - 예상값과 실제값이 다르면 테스트가 실패합니다.
    - 3번째 파라미터 값에 람다식으로 메시지를 넣어두면 테스트 실패 시 해당 메시지가 출력됩니다. (Supplier() )

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

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

  • Assertions.assertThrows(expectedType, executable)
    - assertThrows()메서드는 번째 파라미터에 예상하는 Exception 클래스 타입을 넣고 두번째 파라미터에 실행 코드를 넣으면 됩니다.

2. 개인과제 진행

  1. 요약 : dto, entity, service, controller, repository 순으로 테스트 코드 작성하시오.
  2. 진행사항 : dto, entity까지 진행
  3. 알아가는 점 : 테스트코드를 작성하다보니 의존성 문제가 말로만 하던 의존성을 줄여야한다는 체감하게 되었다.
public void update(CommentRequestDto commentRequestDto) {
    this.comment = commentRequestDto.getComment();
}
  • 해당코드에서는 requestDto를 entity에 끌고오게 되고 reqeustDto는 Controller에서 RequestBody로 받아오기 때문에 생성자와 Setter를 사용하지 않아 데이터를 넣을 방법이 없다.
public void update(String comment) {
    this.comment = comment;
}
  • 다음과 같이 service부분에서 String 형태로 넣어주면 테스트코드에서도 단순히 String을 생성해서 넣어주면 되니 해결할 수 있다.
  1. 결론 : 테스트 코드도 잘 구현할 수 있도록 연습해야하며 개발코드에서도 테스트 환경을 생각하여 의존성을 줄이는 방법으로 개발해야겠다.

0개의 댓글