Kotlin/포스팅

코테스트 비결정적 코드

짜집퍼박사(짜박) 2024. 1. 10. 21:17

코테스트에서 "비결정적 코드"는 각 실행에서 다른 결과를 가지는 코드를 나타냅니다. 이는 주로 난수 생성, 외부 API 호출, 시간에 따른 변화 등과 관련이 있습니다. 즉, 동일한 입력이 주어져도 각 실행에서 예측할 수 없는 결과를 반환하는 코드입니다.

코테스트에서는 비결정적 코드에 대한 테스트를 작성하기 위한 다양한 방법을 제공합니다.

 

1. Seed를 이용한 난수 제어

난수 생성이 포함된 코드를 테스트할 때, 각 실행에서 동일한 시퀀스의 난수를 얻을 수 있도록 seed를 고정하는 방법이 있습니다.

import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe
import kotlin.random.Random

class NonDeterministicCodeTest : StringSpec({

    "test non-deterministic code" {
        val seed = 12345
        val random = Random(seed)

        val result1 = random.nextInt()
        val result2 = random.nextInt()

        result1 shouldBe 1614348189
        result2 shouldBe -1300648071
    }
})

이 예제에서는 Random 클래스의 생성자에 seed를 전달하여, 난수 생성의 기반이 되는 seed를 고정하고 있습니다.

 

2. 의존성 주입을 통한 외부 API 대체

외부 API 호출이 포함된 코드의 테스트를 작성할 때, 해당 외부 API 호출을 대체할 수 있는 mock 또는 stub을 주입하는 방법을 사용할 수 있습니다.

import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe

interface ExternalApi {
    fun fetchData(): String
}

class NonDeterministicCodeTest(private val externalApi: ExternalApi) : StringSpec({

    "test non-deterministic code with external API" {
        // 외부 API 대신에 mock 또는 stub을 주입하여 테스트
        externalApi.fetchData() shouldBe "Mocked data"
    }
})

이 예제에서는 ExternalApi 인터페이스를 정의하고, 테스트 코드에서는 실제 외부 API 호출 대신 mock 또는 stub을 주입하여 테스트하고 있습니다.

 

3. 테스트 더블 사용

비결정적인 코드에 대한 테스트를 작성할 때, 테스트 더블 (예: mock, stub)을 사용하여 해당 코드의 동작을 제어하는 방법을 고려할 수 있습니다.

import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe
import io.mockk.every
import io.mockk.mockk

class NonDeterministicCodeTest : StringSpec({

    "test non-deterministic code with mock" {
        val mockExternalApi = mockk<ExternalApi> {
            every { fetchData() } returns "Mocked data"
        }

        val result = CodeUnderTest(mockExternalApi).getResult()

        result shouldBe "Mocked data"
    }
})

이 예제에서는 MockK 라이브러리를 사용하여 ExternalApi의 mock을 생성하고, 해당 mock을 주입하여 CodeUnderTest 클래스를 테스트하고 있습니다.

비결정적 코드에 대한 테스트는 예상치 못한 결과에 대비하여 안정적인 소프트웨어를 구축하는 데 중요합니다. 이를 위해 seed를 이용한 난수 제어, 의존성 주입, 테스트 더블 사용 등의 기법을 적절히 활용할 수 있습니다.

 

With ChatGPT

'Kotlin > 포스팅' 카테고리의 다른 글

코틀린 픽스처와 설정  (0) 2024.01.10
코테스트 속성 기반 테스트  (0) 2024.01.10
코테스트 예외 처리  (0) 2024.01.10
코테스트 인스펙터  (0) 2024.01.10
코틀린 인스펙터  (0) 2024.01.10