시험에서 AllMatch식 처리를 함부로 하지 마라

6703 단어 JavaTestJUnittech

무슨 말?


시험을 대전제로 썼는데 그 시험에 실패했을 때를 고려했나요?이렇게 되면
구체적인 예에 관해서는 여러 가지 견해가 있다.

어떤 상황입니까?


예를 들어 사용자 일람표를 가져올 때 50명 이하의 사용자만 ID를 받을 수 있는지 테스트하려고 한다.
(이제 실제로 이런 테스트를 진행할지 모르겠다.)
사용자 소유id.
public class User {
    private final Integer id;
    // コンストラクタ・ゲッターは省略
}

allMatch 설치 사용


자, getUserList 이런 방법으로 사용자를 얻고, 결단 ID는 50 이하입니다!
public class UserListTest {
    @Test
    public void test_getUserList() {
        List<User> userList = getUserList();
        assertTrue(userList.stream().allMatch(user -> user.getId() <= 50));
    }
}
됐다!
아주 간단하게 썼어요. 느낌이 좋아요.🤔

뭐가 안 좋아요?


만약 이런 시험이라면 시험에 실패할 때 무엇을 틀렸는지 파악하기 어렵다.
예를 들어 id=60의 사용자가 목록에 포함될 때 다음과 같은 로그를 출력합니다.
expected: <true> but was: <false>
이렇게 되면 어떤 데이터가 포함되어 있는지 모르겠다userList. 왜 테스트에 실패했는지 모르겠다.

시험해 보다


public class UserListTest {
    @Test
    public void test_getUserList() {
        List<User> userList = getUserList();
        List<User> filtered = userList.stream()
            .filter(user -> !(user.getId() <= 50))
            .collect(Collectors.toList());
        assertEquals(filtered, Collections.emptyList());
    }
}
이렇게 ID가 50 이하인 사용자를 삭제하고 그 결과가 빈 목록과 같다고 단언합니다.
행수도 늘어나고 조건도 부정계로 바뀌어 가독성이 약간 떨어질 수 있지만 테스트에 실패할 때의 로그는 이해하기 쉽다.
expected: <[]> but was: <[User(id=60)]>

총결산

  • 테스트에 실패할 때 어떤 로그를 출력할지 생각하면서 테스트를 써라
  • 이를 위해 assertTrue 대신 assertEquals 사용하세요
  • 메모지

  • 샘플창고: https://github.com/sanopi/dont-use-allmatch/
  • 샘플 코드에서 리스트의 구체적인 유형은 다를 수 있으나 결단에는 문제가 없다.관심 있는 사람은 assertEquals의 설치와 java.util.List#equals의 문서를 참고하세요.
  • 좋은 웹페이지 즐겨찾기