본문 바로가기

개발 일지/TIL

[ #41 ] TIL

✏️ 0613      


Spring 심화 강의

수준별 학습: 스탠다드 이론반


단위 테스트 란?

 

 

 

  • Development: 개발
  • Unit Tests (단위 테스트): 개발자 테스트
  • QA Testing: 블랙박스 테스팅
    주로 QA 팀이 Production 환경과 유사한 환경(Stage)에서 테스팅
  • Production: 실 서비스 운영 환경

버그 발견 시간이 늦어짐에 따라 비용이 기하급수적으로 커지는 걸 알 수 있다
시간이 걸릴 수록 그 버그로 인해 피해본 사용자가 많아지기 때문  !
회사가 손해볼 수 있는 기능들은 무조건 테스트 기능이 있어야 하겠다... (ㅎㄷㄷ

 

테스트 코드를 작성한다면 프로그램의 버그를 사전에 발견하여

기하급수적인 비용의 증가가능성을 사전에 방지할 수 있다 !!

 

 

단위 테스트

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

@BeforEach
// 각각의 테스트 코드가 실행되기 전에 수행되는 메서드를 만들어준다

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

@BeforeAll
// 모든 테스트 코드가 실행되니 전에 최초로 수행

@AfterAll
// 모든 테스트 코드가 실행된 후 마지막으로 수행

지인짜 어노테이션 너무 많아...

 

 

테스트 코드에서도 내부 메서드를 만들 수 있다

@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");
    }
}
@DisplayName("테스트의 내용을 한눈에 알아볼 수 있게 네이밍 해줄 때")
void test1() {
    System.out.println("테스트 내용 빠르게 파악");
}

 

@Nested 

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

 

@DisplayName

테스트의 내용을 한눈에 알아볼 수 있게 네이밍 해줄 때 (주석처리 느낌)

메서드 이름에 신경써줄 필요가 없어서 효율적으로 테스트 코드 작성 가능

 

@Order
메서드 단위로 순서를 매겨야 될 때 사용한다
사용 방법은 TestMethodOder어쩌고저쩌고이러쿵저러쿵 겁나 긴거
를 클래스 위에 달아줘야 한다

 

 

메서드를 반복해서 돌릴 수 있는 테스트 기능
// value = 5 >>> 메서드를 5번 반복할 건데
// {currentRepetition} / {totalRepetitions}
// 반복 회차 1 : 종합 회차 5
RepetitionInfo 를 통해 for 문 처럼 현재 반복 횟수와 총 횟수 값을 사용할 수 있다
@RepeatedTest(value = 5, name = "반복 테스트 {currentRepetition} / {totalRepetitions}")
void repeatTest(RepetitionInfo info) {
    System.out.println("테스트 반복 : " + info.getCurrentRepetition() + " / " + info.getTotalRepetitions());
}

 

@RepeatedTest

 

@RepeatedTest

메서드를 반복해서 돌릴 수 있는 테스트 기능

 

 

@DisplayName("파라미터 값 활용하여 테스트 하기")
@ParameterizedTest
@ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8, 9})
void parameterTest(int num) {
    System.out.println("5 * num = " + 5 * num);
}

@ValueSource

@ValueSource

전달해주고 싶은 파라미터 값 (전달되는 파라미터 수 만큼 테스트 메서드가 수행된다)

 

 

반복해서 테스트를 수행해야할 때

@RepeatedTest , @ValueSource 두가지 중 상황에 맞게 테스트 코드를 작성하면 될 것 같다

 

 

제에에에에에일 중요한 검증할 때 사용하는 Assertions 패키지 에 들어있는 기능들

 

Given - When - Then 패턴 : 테스트 코드 스타일을 표현하는 방식
테스트 코드 작성하는 스타일이 여러가지 있는데 그중에 굉장히 유명하고 대중적인 방식이다

 

Given 은 테스트 하고자 하는 대상을 실제로 실행하기 전에 그 테스트에 필요한 값들을 미리 선언
When 은 테스트 하고자 하는 대상을 실제로 실행시킨다
Then 은 어떤 특정한 행동 때문에 발생할 거라고 예상되는 결과에 대해 예측하고 또 맞는지 확인

 

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

 

엄청 특별할 것도 어려울 것도 없이 그냥 우리가 테스트 코드를 좀 더 알아보기 쉽게

그리고 협업하는 과정에서 이런 테스트 코드 짜는 방식이 다 다르면 문제가 발생할 수 있다


해당 테스트 코드를 작성한 사람이 퇴사하면 다른 분들이 작성을 해야 하기 때문에

테스트 코드 스타일을 맞추는 것도 개발 스타일 맞추는 것 만큼 중요하다

그렇기에 테스트 코드 작성하는 패턴들이 많이 생겨났고 그중에 GWT 패턴이 유명한 패턴 중 하나다

 

 

❇️ 결론

  • Give 우리가 줘야할 데이터, 테스트할 때 필요한 데이터
  • When 실행하는 거
  • Then 검증하는 거

 

https://junit.org/junit5/docs/current/user-guide/#writing-tests-annotations

 

JUnit 5 User Guide

Although the JUnit Jupiter programming model and extension model do not support JUnit 4 features such as Rules and Runners natively, it is not expected that source code maintainers will need to update all of their existing tests, test extensions, and custo

junit.org

🔺🔺🔺🔺🔺

Junit5 에 어떤 annotation들을 제공하고 있는지 볼 수 있당

'개발 일지 > TIL' 카테고리의 다른 글

[ #43 ] TIL  (0) 2024.06.17
[ #42 ] TIL  (0) 2024.06.14
[ #40 ] TIL  (0) 2024.06.12
[ #39 ] TIL  (3) 2024.06.11
[ #37 ] TIL  (0) 2024.06.07