Test

[Test] Junit 5와 AssertJ를 같이 사용하는 이유

Alsong 2025. 1. 26. 21:43

저번에 코틀린에서 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가 제공하는 단언 함수입니다. 뜻을 살펴보자면, "나는 actual3과 같다고 단언한다"라는 의미이죠.

 

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를 꼭 써주자고요! ㅎㅎ