스프링 강의를 듣던 중 테스트 코드부분에서 아래의 1번으로 2번 테스트 코드의 차이점이 무엇인가에 대한 의문점이 생겼습니다.
// 1.
assertThat(member.getName()).isEqualTo(result.getName());
// 2.
Assertions.assertThat(member.getName()).isEqualTo(result);
그래서 위 두 코드의 차이점을 알아보고 싶었습니다.
ㅇ 테스트 코드란?
: 오류가 났을 때 기대값과 실제 값을 둘 다 보여줘서 어떤 부분이 틀렸는지 명확히 보여줘 오류 찾는 시간을 단축시킨다.
- @Test : 테스트 대상 메서드를 지정
- @Test ( timeout = 밀리초 ) : 테스트 메소드 수행시간을 제한
- @Ignore : 해당 메서드의 테스트가 진행되지 않도록 지정
- @BeforeEach : 모든 @Test메서드 실행 전에 실행되는 메서드를 지정 어노테이션
- @AfterEach : 모든 @Test메서드의 실행이 끝난 후 실행되는 메서드 지정 어노트에션
- @BeforeAll / @AfterAll : 해당 테스트 클래스가 실행될 때 / 실행 끝났을 때 딱 한번 수행되는 테스트 코드 지정 어노테이션
ㅇ 두 테스트 코드의 설명
1. assertThat( actual ).isEqualTo( expected )
: org.junit.Assert.assertThat 클래스
: actual - 실제 값, expected - 내가 기대한 값
2. Assertions.assertThat()
: org.assertj.core.api.Assertions 클래스
: assertThat으로 비교할 대상을 설정하고 isEqualTo()로 사용자가 생각하는 값을 비교한 뒤 그게 맞는지 검사하는 테스트
ㅇ 차이점
1. assertThat( actual , Matcher )
- actual 인자 : 검증 대상을 넣음
- Matcher 인자 : 로직을 주입받아 검증 단계 수행
이 부분에서 Matcher 를 개발자가 직접 구현하는 것은 비효율적이고, 이 부분에서 오류가 발생할 수 있습니다.
오류가 발생하면 테스트는 실패하는데 외부 요인에 영향을 받는 것은 좋은 테스트가 아닙니다.
문제점 1) 자동완성
: allOf, graterThan, lessThan 등 메서드를 미리 import 해놓지 않으면 자동 완성해주지 못하기 때문에
공식 문서를 찾거나 이름을 외워서 작성해야 합니다.
문제점 2) Assetions 분류 ( Matcher )
: hamcrest에 구현된 matcher를 사용해야하는데 여러 타입의 matcher가 함께 있으니 내가 원하는 타입의
matcher 찾기가 불편합니다.
문제점 3) 확장성
: 추가된 조건도 같이 검증하기 위해선 allOf 라는 메소드로 기존 조건을 묶어줘야하는데 이는 가독성이 좋지 않습니다.
* hamcrest matcher 란?
https://tjdwns4537.tistory.com/38
2. Assertions
: 이러한 문제점 세가지를 해결한게 org.assertj.core.api.Assertions 에서 제공하는 assertThat입니다.
필요한 메서드를 검색해서 import 해야하는 번거로움도 없고, 가독성도 좋습니다.
* 결론
: org.assertj.core.api.Assertions 에서 제공하는 Assetions 로 테스트를 진행하도록 하자.
* 그 외 테스트 코드
1) Assertions.assertThat().isInstanceOf()
: assertThat - 테스트할 대상, isInstanceOf - 앞의 테스트대상의 인스턴스인가? 라고 묻는 것으로
앞에 자식이 될 요소, 뒤를 부모가 될 요소를 넣는다. 즉, 참조나 상속을 받고있는지 묻는 것이다.
* org.junit.jupiter.api.Assertions.assertThrows 클래스를 사용
2) Assertions.assertThrows(에러클래스,에러발생)
: 일부러 오류를 발생시키는 테스트 코드이다. 이는 예외로 들어와서 오류가 제대로 나오는지 테스트하기 위함이다.
: assertThrows의 첫번째 인자 - 에러, 두번째 인자 - 에러 발생 요소
: 제대로 에러가 뜨면 True를 반환