Jetpack Compose - Coroutine, Unit Test

2024. 2. 27. 19:54IT/Android

728x90

<미리 보기>

 

 

<소스 코드>

https://github.com/SeongHyunJeon/android-kotlin-practice/tree/ea4f1a5ff0254a86a02e768544172e491aaaed03/Race%20Tracker

 

 

<정리>

LinearProgressIndicator() - 진행 상황 막대 컴포저블로, 프로퍼티 progress에 0~1 사이의 값을 float타입으로 전달하여 사용할 수 있다. 

LinearProgressIndicator(
    progress = currentProgress / maxProgress.toFloat(),
    modifier = Modifier
        .fillMaxWidth()
        .height(dimensionResource(R.dimen.progress_indicator_height))
        .clip(RoundedCornerShape(dimensionResource(R.dimen.progress_indicator_corner_radius)))
)

LaunchedEffect() - 컴포지션에 유지되는 동안 코루틴을 생성하여 람다에 선언된 작업들을 실행하는 컴포저블 함수로, 주로 UI 상태를 업데이트하기 위해 사용되며 컴포지션에서 삭제되면 해당 코루틴은 취소된다. 인자로 전달된 인스턴스는 키로 등록되며, 해당 키의 참조 값이변경되면 코루틴은 취소 되었다가 다시 실행된다.

LaunchedEffect(playerOne, playerTwo) {
    coroutineScope {
        launch { playerOne.run() }
        launch { playerTwo.run() }
    }
    raceInProgress = false
}

runTest() - 테스트에서 사용할 수 있는 코루틴 빌더로, delay() 호출을 무시한다.

class RaceParticipantTest {
    private val raceParticipant = RaceParticipant(
        name = "Test",
        maxProgress = 100,
        progressDelayMillis = 500L,
        initialProgress = 0,
        progressIncrement = 1
    )

    @Test
    fun raceParticipant_RaceStarted_ProgressUpdated() = runTest {
        val expectedProgress = 1
        launch { raceParticipant.run() } //중간의 진행률을 파악할 수 있도록 비동기적으로 구현.
        advanceTimeBy(raceParticipant.progressDelayMillis) //인자로 받은 값만큼 시간을 진행.
        runCurrent() //진행된 시간 이후 대기중인 모든 코루틴 실행.
        assertEquals(expectedProgress, raceParticipant.currentProgress)
    }
}

*테스트 코드에선 비동기 실행을 위한 코루틴은 runCurrent() 함수를 호출하여 실행해주어야 한다.

728x90