"내 코드가 진짜 잘 돌아갈까?" 🤓 개발자의 이 불안함을 없애주는 유일한 방법은 테스트 코드(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의 즐거움을 느껴보세요!
'Dev Log > Kotlin' 카테고리의 다른 글
| [Kotlin] 코틀린 컬렉션 함수 정복하기: map, filter, forEach의 모든 것 (0) | 2026.01.03 |
|---|---|
| [Kotlin] 예외 처리 패턴: 사용자 입력을 '우아하게' 다시 받는 법 (ft. 재귀 함수) (0) | 2026.01.02 |
| [Kotlin] 안전한 코드를 위한 최소 요구사항 검증! require, check, assert 총정리 (0) | 2026.01.02 |
| [Kotlin] 코틀린 문자열 자르기와 다루기 완전 정복 (split, substring, 정규식) (0) | 2026.01.02 |
| [우테코 AN 8기] 프리코스 | 클린 코드란 무엇일까? (ex. Kotlin) (0) | 2025.10.18 |