스프링 강의를 듣던 중 테스트 코드부분에서 아래의 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

 

Hamcrest, Matcher란?

ㅇ Matcher 클래스 : Matcher 클래스는 대상 문자읠 패턴을 해석하고 주어진 패턴과 일치하는지 판별할 때 주로 사용됩니다. 입력 값으로는 CharSequence라는 새로운 인터페이스가 주로 사용되는데, 다

tjdwns4537.tistory.com

 

 

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를 반환

+ Recent posts