assertThat vs assertAll vs assertSoftly

토마스·2023년 2월 26일
1

우테코 로또 미션을 진행하면서 다른 사람들의 코드 리뷰를 봤다. 그러던 중 하나의 테스트 함수에서 어떤 기능의 여러 결과를 검증하기 위해 assertThat을 여러 줄 작성한 코드에 대해 리뷰어가 assertAll을 쓰라고 추천한 리뷰를 봤다. assertThat을 여러 줄 작성해도 하나의 검증문만 실패해도 테스트가 실패하는데, 모든 검증문이 통과하는 것을 목표로 하기 때문에 상관없지 않나? 라는 생각을 했다. 그래서 assertAll에 대해 찾아보았다.
여기에서 assertAll은 모든 검증문을 실행 후 검증 결과를 알려주는 반면에 assertAll을 사용하지 않고 assertThat을 여러 줄 사용하면 검증문이 실패하자마자 테스트가 종료된다고 한다.
그래서 직접 실행해보았다.

이 코드를 실행한 결과 assertThat을 여러 줄 작성한 테스트는

1과 2를 비교한 검증문의 결과만 콘솔에 출력하고 다른 검증문의 결과는 출력되지 않았다.
하지만 assertAll로 여러 검증문을 감싼 테스트는

모든 검증문의 실행 결과를 출력했다.
assertAll이란 이름 그대로 "모두 검증"했다. 만약 한 번에 꽤 많은 검증문을 실행할 때 하나의 검증문이 실패되었을 때 테스트 코드가 종료된다면 실패된 검증문을 성공하도록 고치고 다시 모든 검증문을 실행해서 검증해봐야 한다. 하지만 assertAll을 사용해 모든 검증문의 결과를 한 번에 볼 수 있다면 내가 고쳐야할 것을 빠르게 알 수 있다.
그리고 assertSoftly라는 것도 있다는 것을 알았다. assertAll과의 차이점은 실패한 검증문의 위치를 콘솔을 이용해 빠르게 이동할 수 있다는 것이다.

내가 실패한 검증문의 라인을 클릭하면 바로 이동할 수 있다는 장점이 있다.

개인적인 생각

여러 검증문을 하나의 테스트 코드로 검증할 때 assertAll과 assertSoftly 중 어떤 것을 선택할 지 고민할 수 있다. 나는 검증문이 많지 않다면 assertAll을 사용하고, 검증문이 많다면 assertSoftly를 사용할 것 같다. assertAll을 선택하는 가장 주된 이유는 함수명이 직관적이라는 것이다. 여러 검증문을 모두 검증하고자 하는 함수명으로서 "모두 단언한다"라는 말이 "부드럽게 단언한다"보다 더 어울린다고 생각하기 때문이다. 하지만 만약 검증문이 12개이고 assertAll로 실행했을 때 실패하는 검증문이 6개라면 어떤 검증문이 실패했는지 알기 위해 에러 메세지를 읽어보며 의미를 파악해야 한다. 하지만 assertSoftly를 사용한다면 단지 클릭하는 것만으로 어떤 검증문이 실패했는지 알 수 있다. 그래도 나는 거의 assertAll을 사용할 것 같다. 우선 테스트가 실패하지 않는다면 assertSoftly의 장점이 사라지고, 검증문이 많지 않아도 assertSoftly의 장점이 크게 작용하지 않는다고 생각하기 때문이다. 또한 검증문을 한 테스트 함수에 많이 쓸 일도 없을 것 같아서 assertAll을 주로 사용할 것 같다.

profile
안드로이드 개발자 지망생

0개의 댓글