ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 테스트팁 - 좋은 테스트 코드
    TDD 2024. 6. 26. 20:18
    test

     

     

     

     

    테스트할 시간이 없다? 화장실 다녀오면서 손 씻을 시간을 별로도 잡는건가?
     - 11번가 백명석님 - 
     💡 이 게시글은 계속해서 변화하는 게시글입니다.
    제가 테스트 코드를 작성하면서 느낀 것을 나열한 것으로 언제든지 방향을 바꿀 수도 있습니다.

     

     

    테스트 도구로 assertj 와 junit 중에 assertj를 사용하자

    스프링팀은 assertj 를 사용하고 있으며

    Junit 팀은 자신의 도구로도 충분하지만 만약 부족하다면 assertj를 쓰라고 권장하고 있다

    Junit는 기본적으로 기댓값 실제값으로 파라미터를 두 개를 받지만 assertj는 파라미터 하나에 체인으로 사용하기에 의미를 알기 좋다.

    assertThat("str").isEqualTo("str");
    
    assertThat(2)
            .isNotZero()
            .isGreaterThan(1)
            .isGreaterThanOrEqualTo(1);
            
    assertThat("hello")
            .as("해당 테스트 실패시 출력할 설명 메시지")
            .isNotNull()
            .startsWith("h")
            .endsWith("o");
    
    assertThatThrownBy(() -> {
        throw new RuntimeException("error message");
    }).hasMessage("error message");
    
    assertThatExceptionOfType(RuntimeException.class)
            .isThrownBy(() -> {
                throw new RuntimeException("error message");
            })
            .withMessage("error message");
    
    List<String> list = List.of("first", "second");
    assertThat(list)
            .isNotNull()
            .contains("first")
            .containsAll(list)
            .isEqualTo(list);

    테스트 메서드의 이름에 테스트 대상의 이름을 넣지 말자

    테스트 메소드의 명명 방법은 다양하게 있다

    테스트 대상의 이름을 사용하여 작성하는 경우 대상의 이름이 변경 시 테스트 메서드 명도 변경해야 하기 때문에 좋지 않다.

    또한 기능을 기술하여 작성한 이름이면 일관성이 떨어질 가능성이 있다.

    Given, Should, When, Then 단어를 활용하여 작성하는 방법이 좋다고 생각한다.

    (Should_ThrowException_When_AgeLessThan18)

    테스트코드도 코드이니 상속이 아닌 합성으로

    말 그대로 테스트 코드 또한 코드이기에 테스트 코드의 중복을 해결하기 위해 상위 클래스를 상속받도록 하게 되면

    상속의 문제가 모두 발생한다.

    중복을 적절히 나눠서 합성으로 해야 한다.

    반복 테스트 에는 ParameterizedTest를 사용하자

    public static Stream<Arguments> getInstanceParameters() {
        return Stream.of(
                arguments(null, "ABC", "DEF"),
                arguments(UUID.randomUUID(), null, "DEF"),
                arguments(UUID.randomUUID(), "ABC", null)
        );
    }
    
    @ParameterizedTest(name = "인스턴스 생성시 Null 허용 안한다: id = {0}, loginId = {1}, LoginPwd = {2}")
    @MethodSource("getInstanceParameters")
    void failCreateInstance(UUID id, String loginId, String loginPwd) {
        Assertions.assertThatThrownBy(() -> Member.withId(id, loginId, loginPwd))
                .isInstanceOf(IllegalArgumentException.class);
    }

    테스트 메서드에는 public를 붙이지 말자

    Junit5에는 test method에 public 메서드를 붙이지 말고 default 접근 제한자를 사용하자.

    SonarLint에서도 public test method를 사용하지 말고 default 접근 제한자를 사용하라고 권장한다.

    https://junit.org/junit5/docs/current/user-guide/#writing-tests-classes-and-methods

    'TDD' 카테고리의 다른 글

    테스트팁 - 테스트 하기 좋은 코드  (0) 2024.06.26
    테스트팁 - 테스트 작성 방법  (0) 2024.06.26