Tiny Star
본문 바로가기
Dev Log/Kotlin

[Kotlin/Test] 테스트 코드 작성을 위한 JUnit5와 AssertJ 문법 총정리 (TDD 기초)

by 별터 2026. 1. 2.

"내 코드가 진짜 잘 돌아갈까?" 🤓 개발자의 이 불안함을 없애주는 유일한 방법은 테스트 코드(Test Code)를 작성하는 것입니다. 특히 우아한테크코스 같은 교육 과정이나 현업에서는 TDD(테스트 주도 개발)가 매우 중요합니다.

 

오늘은 코틀린에서 테스트 코드를 작성할 때 사용하는 대표적인 도구인 JUnit5와, 가독성 끝판왕 AssertJ의 사용법을 정리해 봅니다.


1. JUnit5 vs AssertJ: 무엇이 다른가요?

 

- JUnit5 (Assertions): 자바/코틀린의 표준 테스트 프레임워크입니다.

   assrtEquals 같은 함수를 제공합니다.

- AssertJ (assertThat): 테스트 코드를 마치 영어 문장을 읽는 것처럼 쓸 수 있게 해주는 라이브러리입니다. 훨씬 직관적이라 실무에서 매우 선호합니다.

 

비교해 봅시다.

// JUnit5 스타일
assertEquals(3, result) // (기대값, 실제값) -> 순서가 헷갈림

// AssertJ 스타일 ✨
assertThat(result).isEqualTo(3) // "결과는 3과 같아야 한다" -> 직관적

2. AssertJ 핵심 문법 (assertThat)

 

모든 테스트는 assertThat(검증할값) 으로 시작합니다. 그 뒤에 점(.)을 찍어 조건을 연결합니다.

 

① 값 비교하기

val age = 20

assertThat(age).isEqualTo(20) // 같은가?
assertThat(age).isNotEqualTo(10) // 다른가?
assertThat(age).isGreaterThan(10) // 10보다 큰가?

 

② 문자열(String) 검증

val name = "StarterKim"

assertThat(name).startsWith("Start") // "Start"로 시작하는가?
assertThat(name).endsWith("Kim") // "Kim"으로 끝나는가?
assertThat(name).contains("er") // "er"을 포함하는가?
assertThat(name).doesNotContain("Lee") // "Lee"가 없는가?

 

③ 리스트(List) 검증 (매우 중요 ⭐)

계산기 과제에서 split 결과를 검증할 때 유용합니다.

val numbers = listOf("1", "2", "3")

assertThat(numbers).hasSize(3) // 리스트 크기가 3인가?
assertThat(numbers).contains("1", "3") // 1과 3이 들어있는가? (순서 무관)
assertThat(numbers).containsExactly("1", "2", "3") // 정확히 이 순서대로 들어있는가?

3. 예외(Exception) 테스트하기

 

잘못된 값이 들어왔을 때 프로그램이 에러를 잘 터뜨리는지 확인하는 것도 중요합니다.

 

방법 1: assertThrows (JUnit5)

assertThrows<IllegalArgumentException> {
    calculator.calculate("abc") // 숫자가 아닌 값 입력
}

 

방법 2: assertThatThrownBy (AssertJ) - 추천 👍

에러 메시지까지 검증할 수 있어 더 강력합니다.

assertThatThrownBy {
    divider.divide("1,,2") // 잘못된 구분자 입력
}
.isInstanceOf(IllegalArgumentException::class.java) // 이 에러가 발생해야 함
.hasMessageContaining("잘못된 입력") // 에러 메시지에 이 말이 있어야 함

4. 코틀린 테스트의 꿀팁: 백팁(`) 함수 이름

 

자바에서는 테스트 함수 이름을 testCalculation_success 처럼 영어로 써야 했지만, 코틀린에서는 백틱(`)을 사용해 한글로 함수 이름을 지을 수 있습니다. 가독성이 비약적으로 상승합니다!

@Test
fun `쉼표를 기준으로 문자열을 분리한다`() {
    val input = "1,2,3"
    // ... 테스트 로직
}

@Test
fun `음수가 입력되면 예외가 발생해야 한다`() {
    // ... 테스트 로직
}

마무리

테스트 코드는 작성할 때는 귀찮아 보일 수 있지만, 나중에 리팩토링을 하거나 기능을 추가할 때 나를 지켜주는 든든한 보험이 됩니다. assertThat과 친해져서 TDD의 즐거움을 느껴보세요!