김영한님의 스프링 입문 강의를 듣다가 JUnit의 assertThat / assertj의 assertThat 가 정확히 무엇이 다른지!
테스트 코드를 작성 할 때에 왜 assertj의 assertThat을 사용한건지! 궁금해져서 공부해보기로 했다
1. JUnit이란?
: 자바를 위한 단위 테스트 라이브러리(오픈소스)이다.
: 자바 어플리케이션에 대한 단위 테스트를 쉽게 해주는 테스트용 프레임워크라고 이해하자
# 단위 테스트 Unit Test란?
: 모든 함수와 메소드에 대한 테스트 케이스를 작성하는 절차
: 소스 코드의 특정 모듈이 의도대로 동작하는지 확인
# JUnit의 assert 메소드들
assertEquals(A, B) : 객체 A와 B가 같은 값을 가지는지 확인한다.
assertEquals(A, B, C) : 객체 A와 B가 같은 값을 가지는지 확인한다. C는 오차범위.
assertArrayEquals(A, B) : 배열 A와 B가 일치하는지 확인한다.
assertSame(A, B) : 객체 A와 B가 같은 객체인지 확인한다.
assertTrue(A) : 조건 A가 참인지 확인한다.
assertNull(A) : 객체A가 Null인지 확인한다.
assertNotNull(A) 객체 A가 Null이 아닌지 확인한다.
assertThat() // assertThat이 사용법이 더 쉬움
# JUnit의 어노테이션
@Test
: 메소드 위에 해당 어노테이션을 선언해, 테스트 대상 메소드임을 지정할 수 있다.
@Ignore
: 해당 어노테이션이 선언된 테스트 메소드를 실행하지 않도록 지정한다.
@BeforeEach
: 모든 @Test메소드가 실행되기 전에 실행되는 메소드를 지정하는 어노테이션이다. 각 테스트 시작 전에 각각 호출된다. @Test메서드에서 공통으로 사용되는 코드를 @Before메서드에 선언해 사용하면 좋다. 테스트마다 공통으로 쓰이면서, 테스트 전에 리셋되어야 할 항목이 들어간다
@AfterEach
: 모든 @Test메소드의 실행이 끝난 뒤에 실행되는 메소드를 지정하는 어노테이션이다. 각 테스트가 끝나고 각각 호출된다.
@BeforeAll == (구) BeforeClass
: 해당 테스트 클래스가 실행될 때 딱 한 번만 수행되는 테스트 메소드를 지정하는 어노테이션이다.
@AfterAll == (구) AfterClass
: 해당 테스트 클래스가 실행이 끝난 뒤에 딱 한 번만 수행되는 테스트 메소드를 지정하는 어노테이션이다. 테스트클래스의 모든 테스트가 완료된 뒤 한 번 호출된다.
2. AssertJ란?
: 자바 테스트를 위해 좀 더 풍부한 문법을 제공하고 메서드 체이닝을 통해 직관적인 테스트 흐름을 작성할 수 있도록 개발된 오픈소스 라이브러리
# AssertJ 메소드 임포트
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.Test;
static 임포트를 통해 AssertJ의 다양한 API를 클래스 이름 없이 사용 가능함.
# AssertJ의 assert 메소드
: AssertJ에서 모든 테스트 코드는 assertThat()으로 시작함.
: assertThat(테스트 타겟).메소드1().메소드2().메소드3()
-> 이런 포맷으로 AssertJ의 여러 메소드들을 연쇄적으로 호출해 코드를 작성할 수 있음
#예제
assertThat("Hello, world! Nice to meet you.") // 주어진 "Hello, world! Nice to meet you."라는 문자열은
.isNotEmpty() // 비어있지 않고
.contains("Nice") // "Nice"를 포함하고
.contains("world") // "world"도 포함하고
.doesNotContain("ZZZ") // "ZZZ"는 포함하지 않으며
.startsWith("Hell") // "Hell"로 시작하고
.endsWith("u.") // "u."로 끝나며
.isEqualTo("Hello, world! Nice to meet you."); // "Hello, world! Nice to meet you."과 일치합니다.
assertThat(3.14d) // 주어진 3.14라는 숫자는
.isPositive() // 양수이고
.isGreaterThan(3) // 3보다 크며
.isLessThan(4) // 4보다 작습니다
.isEqualTo(3, offset(1d)) // 오프셋 1 기준으로 3과 같고
.isEqualTo(3.1, offset(0.1d)) // 오프셋 0.1 기준으로 3.1과 같으며
.isEqualTo(3.14); // 오프셋 없이는 3.14와 같습니다
# AssertJ의 메서드들
: 너무 많다 !
# AssertJ 사용시 주의점
: assertThat(Object o)로 테스트할 객체를 호출한 다음 메서드들을 사용해야 한다.
BAD : assertThat(actual.equals(expected));
GOOD : assertThat(actual).isEqualTo(expected);
BAD : assertThat(1 == 2);
GOOD : assertThat(1).isEqualTo(2);
: as()는 assertion 메소드들을 호출하기 전에 사용해야 한다.
* as("설명") : Assertion을 설명하는 메서드. "설명"의 내용이 테스트 결과에 출력됨
assertThat(actual).as("description").isEqualTo(expected);
assertThat(actual).describedAs("description").isEqualTo(expected);
❓왜 AssertJ의 assertThat() ❓
Unit5의 경우, assertEquals(expected, actual)과 같이 두 개의 인자를 받아서 비교를 하지만,
AssertJ는 메소드 체이닝을 통해 가독성을 높여주는 특징이 있다.
assertEquals()는 왼쪽이 expected인지 actual인지 혼동될 여지가 있지만, assertj의 assertThat()은 인자로 검증대상 하나만 요구하고 그 뒤로 메소드 체이닝을 하므로 actual과 expected를 명확하게 구분지어준다는 장점이 존재한다 !
출처
https://steady-coding.tistory.com/349?category=861122
https://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html
'뚝딱뚝딱 > Java' 카테고리의 다른 글
[Java] 자바의 정석 Chapter6 ~ Chapter7 (0) | 2022.05.15 |
---|---|
[Java] 자바의 정석 Chapter1 ~ Chapter5 (0) | 2022.05.13 |
[Java] Arrays.sort() 재정의하기 / Comparator 재정의 / 정렬 조건 바꾸기 (0) | 2022.01.19 |
[Java] Stream이 뭐야! (0) | 2022.01.18 |
[Java] interface, abstract 공부 (0) | 2022.01.18 |