[kotlin] JUnit 테스트와 테스트 주도 개발 (TDD) 주기

프로그래밍을 할 때 가장 중요한 부분 중 하나는 코드의 품질을 유지하고 보증하는 것입니다. 이를 위해 일반적으로 JUnit과 같은 테스트 프레임워크를 사용하여 코드가 예상대로 작동하는지 확인하고, 코드 변경 시에도 예상치 못한 부작용이 발생하지 않도록 하는 것이 좋습니다. 이러한 방식으로 소프트웨어의 안정성을 유지할 수 있으며, 코드의 유지보수성을 향상시킬 수 있습니다.

JUnit이란?

JUnit은 Java 언어를 위한 단위 테스트 프레임워크로, 소프트웨어 개발자들이 예상한대로 코드가 작동하는지 확인하는 데 사용됩니다. 이를 통해 코드 변경 시에 예기치 않은 문제가 발생하는 것을 방지할 수 있습니다.

테스트 주도 개발 (TDD) 주기

테스트 주도 개발 (TDD)은 테스트를 먼저 작성하고, 그 테스트를 통과하기 위한 코드를 작성하는 개발 방법론입니다. 일반적으로 TDD 주기는 다음과 같은 세 가지 단계로 구성됩니다.

1. Red (실패)

첫 번째로, Red 단계에서는 아직 구현되지 않은 기능에 대한 테스트를 작성합니다. 이 테스트는 당연히 실패합니다.

import org.junit.Test
import org.junit.Assert.*

class CalculatorTest {
    @Test
    fun `addition test`() {
        val result = Calculator.add(3, 5)
        assertEquals(8, result)
    }
}

이 테스트를 실행하면 Calculator 클래스나 add 메서드가 존재하지 않기 때문에 실패할 것입니다.

2. Green (성공)

Green 단계에서는 테스트를 통과하기 위한 최소한의 코드를 작성합니다. 주로 임시적인 방법을 사용하여 테스트를 통과시키는 것이 목표입니다.

object Calculator {
    fun add(a: Int, b: Int): Int {
        return a + b
    }
}

이제 테스트를 실행하면 성공할 것입니다.

3. Refactor (리팩터링)

마지막으로, Refactor 단계에서는 작성된 코드를 통합하고, 단위 테스트를 수정하는 등의 작업을 통해 코드의 품질을 향상시킵니다.

object Calculator {
    fun add(a: Int, b: Int): Int {
        return a + b
    }
    
    fun subtract(a: Int, b: Int): Int {
        return a - b
    }
}

class CalculatorTest {
    @Test
    fun `addition test`() {
        val result = Calculator.add(3, 5)
        assertEquals(8, result)
    }
    
    @Test
    fun `subtraction test`() {
        val result = Calculator.subtract(5, 3)
        assertEquals(2, result)
    }
}

마치며

JUnit을 사용하여 TDD 주기를 따르면 코드의 품질을 높일 수 있으며, 안정성을 유지할 수 있습니다. 이를 통해 유지보수성이 높은 소프트웨어를 개발할 수 있습니다.

참고 자료: