Skip to content

Conversation

@alex-eyk
Copy link
Collaborator

@alex-eyk alex-eyk commented May 9, 2022

No description provided.

Copy link

@LionZXY LionZXY left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Основная цель задания была все-таки научиться тестировать корутины. Тут же, несмотря на то что по факту тесты проходят, код однопоточный (runBlocking/join) и при некоторых условиях (например, при экстремально малом delay) его результаты выполнения могут отличаться и тесты проходить некорректно. Так же тест может сломаться измененями в будущих версиях Kotlin/внутреннем механизме диспатчинга корутин.

Чтобы упростить работу я решил написать код на который сильно проще написать тест:

class OriginImplementation(
    private val scope: CoroutineScope
) {
    private val dispatcher = Dispatchers.Default
        .limitedParallelism(1)

    var counter = 0

    suspend fun increaseCounterAndPrintAsync() {
        scope.launch(dispatcher) {
            val oldCounter = counter++
            delay(1000L)
            println("$oldCounter and ${counter++}")
        }
    }
}

Тут важно что я прокидываю scope извне, а значит его можно заменить на TestScope, который развязывает нам руки. Мы, например, можем дожидаться IDLE состояния корутины или, наоборот, пропускать delay. Менять тестируемый код можно, но главное чтобы тест был корректен и для тестирования использовались корутины, а не синхронный код. И да, проверять вывод output stream не обязательно, в том коде что я скинул можно читать counter элемент прямо из теста.

@alex-eyk alex-eyk requested a review from LionZXY May 11, 2022 16:58
Copy link

@LionZXY LionZXY left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ты молодец!
Можно избавиться от проверки outputStream, но главное что тесты сделаны через новый API для теста корутин

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants