[Test] Junit 5와 AssertJ를 같이 사용하는 이유
저번에 코틀린에서 JUnit 5 사용하기 포스팅을 올렸는데요, 일반적으로 테스트코드를 작성할 때 테스팅 프레임워크로 JUnit 5만 사용하지 않습니다. AssertJ라는 라이브러리를 추가로 사용하게 되는데요! AssertJ는 테스트코드의 단언문을 보다 가독성 있게 작성할 수 있도록 도와주는 라이브러리입니다. 이번 포스팅에서는 왜 JUnit 5를 쓰면서 AssertJ도 함께 써야 하는지 알아보겠습니다.
아직 JUnit 5와 테스트코드를 잘 알지 못하시는 분들은 위의 링크로 이전 포스팅을 꼭 읽고 오시길 권장드릴게요!
1. AssertJ 없이 단언문 작성해보기
AssertJ를 사용하지 않아도 단언문 작성이 불가능한 것은 아닙니다. JUnit 5에서 제공하는 단언 함수가 존재합니다. 한 번 볼까요?
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
class MyTest {
@Test
fun `증감 후위 연산자는 계산 이전 값을 반환한다`() {
// given
var a: Int = 3
// when
val actual = a++
// then
assertEquals(3, actual)
}
}
위와 같은 예제 테스트코드가 있다고 해보겠습니다. (저번 포스팅에서 사용했던 예제입니다)
이 코드는 AssertJ를 사용하지 않은 코드입니다. AssertJ가 import 되어있지 않은 걸 확인하실 수 있어요.
단언문 부분을 보시면, assertEquals()
함수를 쓴 걸 보실 수 있을 겁니다. 이 assertEquals()
함수는 JUnit 5가 제공하는 단언 함수입니다. 뜻을 살펴보자면, "나는 actual
이 3
과 같다고 단언한다"라는 의미이죠.
2. AssertJ의 단언문 vs JUnit 5의 단언문
그럼 위의 단언문을 AssertJ에서 제공하는 단언함수로 바꾸면 어떻게 되는지 볼까요? 한 번 둘을 비교해 보도록 하지요!
AssertJ의 단언함수 (assertThat)
assertThat(actual).isEqualTo(3)
JUnit 5의 단언함수 (assertEquals)
assertEquals(3, actual)
보시다시피 AssertJ에서는 assertThat()
과 isEqualTo()
라는 함수를 조합해서 쓰고 있고, JUnit 5에서는 assertEquals()
하나만 쓰고 있습니다. 뭐가 다른가요?
actual
과 3(expected)의 위치가 반대네요. 그게 뭐?라고 하실 수도 있지만 이것이 꽤 중요한 부분입니다.
비단 테스트코드뿐만 아니라, 모든 코드는 자연어처럼 읽혀야 좋은 코드입니다. 그래야 가독성이 올라가고 코드를 분석하는 데 적은 시간이 걸리죠.
assertThat(actual).isEqualTo(3)
이라는 코드는 왼쪽에서 오른쪽으로 자연스럽게 읽힙니다. 코드를 풀어써서 "Assert that actual is equal to 3"라고 써도 읽는 데 지장이 없을 정도지요. AssertJ에서 추가로 제공하는 isEqualTo()
함수도 코드의 가독성을 크게 높여주고 있습니다.
반면 assertEquals(3, actual)
은 영 자연스럽게 읽히지 않네요. 게다가 앞의 값과 뒤의 값 중 어떤 게 actual이고 expected인지 알기도 어렵습니다. 이러한 이유로 JUnit 5에서 제공하는 단언문은 잘 쓰이지 않고, AssertJ를 추가로 사용하게 되는 겁니다.
그 외에 AssertJ에서는 JUnit 5보다 훨씬 많은 단언 함수를 제공합니다. 이 다양한 메서드들을 통해 우리는 단언문을 더 쉽게, 편하게, 잘 읽히게 작성할 수가 있는 것이죠!
저도 대부분은 모르지만, 점(.)을 찍어보면 함수가 정말 많이 뜨는 걸 보실 수 있죠.
게다가 AssertJ는 메서드 체이닝도 제공해서, 여러 테스트를 한 번에 할 수도 있답니다. 이를테면
assertThat(actual)
.isEqualTo(3)
.isOdd()
.isGreaterThan(2)
.isNotNull()
이런 단언문도 작성 가능하지요! 대표적인 몇 가지만 소개드렸지만 AssertJ를 사용하는 이유는 더 많고 다양하다고 하네요! 😄
3. 정리
이제 AssertJ를 쓰는 이유가 이해되셨을까요? 정리하자면,
AssertJ가 제공하는 다양한 단언 함수를 사용함으로써 더 쉽고 편하게 가독성이 뛰어난 단언문을 작성할 수 있다!
라고 할 수 있겠습니다. 앞으로 테스트 코드 짤 때 AssertJ를 꼭 써주자고요! ㅎㅎ