KT Kotlin  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Тестирование Kotlin-кода

Задания проверяют качество тестов, а не знание названий библиотек: изоляцию, управление временем корутин, генерацию данных и границы интеграционного сценария. Хороший ответ должен объяснять, какой дефект поймает проверка и почему она не зависит от случайного порядка выполнения.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На 30 вопросов отведено 85 минут. В каждом задании верен только один вариант. После завершения будут показаны общий результат и 6 тематических шкал.
Вопрос 1 из 30
Решение для «Управляемый lifecycle worker»: Добавить идемпотентный start или запрет повторного запуска, обработку ошибки process и deterministic shutdown. Что в нём остаётся не бесплатным?
Вопрос 2 из 30
Что станет новой точкой внимания после изменения «Внедрённые часы в unit-тесте»: Составить таблицу границ периода и оставить системный Clock только в рабочей среде adapter?
Вопрос 3 из 30
Что проверяется без реальной секунды ожидания?
KotlinТестирование корутин · Граница виртуальной задержки
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*
@Test fun emits_after_delay() = runTest {
    val flow = flow { delay(1_000); emit(1) }
    val deferred = async { flow.first() }
    advanceTimeBy(999)
    assertFalse(deferred.isCompleted)
    advanceTimeBy(1)
    assertEquals(1, deferred.await())
}
Вопрос 4 из 30
Какое утверждение точнее всего объясняет поведение фрагмента «Инвариант и генерация данных»?
KotlinProperty-based подход · Инвариант и генерация данных
// На ревью требуется объяснить причину поведения.
class ReversePropertyTest : StringSpec({
    property("reverse twice") {
        checkAll<String> { s -> s.reversed().reversed() shouldBe s }
    }
})
Вопрос 5 из 30
Какой рефакторинг делает поведение «Реальная транзакция order/outbox» предсказуемее?
KotlinИнтеграционные тесты · Реальная транзакция order/outbox
// Сохраните назначение фрагмента, но укрепите его контракт.
@Test fun repository_commits_order_and_outbox() = withDatabaseContainer {
    val id = service.place(command)
    assertNotNull(orderTable.find(id))
    assertEquals(1, outboxTable.countFor(id))
}
Вопрос 6 из 30
Какой соседний случай отличает устойчивое решение «Сигналы качества в CI» от удачного примера?
Вопрос 7 из 30
Как сделать unit-тест детерминированным?
KotlinМодульные тесты · Внедрённые часы в unit-тесте
// Проследите фактическое выполнение без изменения кода.
class Discount(private val clock: Clock) {
    fun apply(order: Order): Money = if (clock.today() in order.promoDays) order.total * 0.9 else order.total
}
Вопрос 8 из 30
На какой контракт языка или библиотеки опирается «Граница виртуальной задержки»?
KotlinТестирование корутин · Граница виртуальной задержки
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*
@Test fun emits_after_delay() = runTest {
    val flow = flow { delay(1_000); emit(1) }
    val deferred = async { flow.first() }
    advanceTimeBy(999)
    assertFalse(deferred.isCompleted)
    advanceTimeBy(1)
    assertEquals(1, deferred.await())
}
Вопрос 9 из 30
Какую точечную правку стоит принять на ревью фрагмента «Инвариант и генерация данных»?
KotlinProperty-based подход · Инвариант и генерация данных
// Сохраните назначение фрагмента, но укрепите его контракт.
class ReversePropertyTest : StringSpec({
    property("reverse twice") {
        checkAll<String> { s -> s.reversed().reversed() shouldBe s }
    }
})
Вопрос 10 из 30
Какой соседний случай отличает устойчивое решение «Реальная транзакция order/outbox» от удачного примера?
Вопрос 11 из 30
Для «Сигналы качества в CI» предлагают правку: Задать пороги по модулям, разбирать выжившие мутации и не стимулировать пустые assertions ради числа. Какой компромисс нельзя пропустить?
Вопрос 12 из 30
Что нужно сделать для тестируемого жизненного цикла?
KotlinАрхитектура и конкурентность · Управляемый lifecycle worker
// Проследите фактическое выполнение без изменения кода.
import kotlinx.coroutines.*
class Worker(private val scope: CoroutineScope, private val queue: Queue) {
    fun start(): Job = scope.launch {
        queue.items.collect { process(it) }
    }
}
Вопрос 13 из 30
Как сделать ответственность во фрагменте «Граница виртуальной задержки» понятной следующему разработчику?
KotlinТестирование корутин · Граница виртуальной задержки
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*
@Test fun emits_after_delay() = runTest {
    val flow = flow { delay(1_000); emit(1) }
    val deferred = async { flow.first() }
    advanceTimeBy(999)
    assertFalse(deferred.isCompleted)
    advanceTimeBy(1)
    assertEquals(1, deferred.await())
}
Вопрос 14 из 30
Какой редкий случай способен сломать наивную трактовку «Инвариант и генерация данных»?
Вопрос 15 из 30
Что станет новой точкой внимания после изменения «Реальная транзакция order/outbox»: Накатывать те же migrations, изолировать тест транзакцией/схемой и проверять failure path с rollback?
Вопрос 16 из 30
Как интерпретировать высокое покрытие строк?
KotlinТестирование и инструменты · Сигналы качества в CI
// Проследите фактическое выполнение без изменения кода.
// build.gradle.kts
tasks.test {
    useJUnitPlatform()
    testLogging { events("failed", "skipped") }
}
// static analysis + coverage + mutation report in CI
Вопрос 17 из 30
На какой контракт языка или библиотеки опирается «Управляемый lifecycle worker»?
KotlinАрхитектура и конкурентность · Управляемый lifecycle worker
// На ревью требуется объяснить причину поведения.
import kotlinx.coroutines.*
class Worker(private val scope: CoroutineScope, private val queue: Queue) {
    fun start(): Job = scope.launch {
        queue.items.collect { process(it) }
    }
}
Вопрос 18 из 30
Какое объяснение результата «Внедрённые часы в unit-тесте» выдерживает проверку соседними случаями?
KotlinМодульные тесты · Внедрённые часы в unit-тесте
// На ревью требуется объяснить причину поведения.
class Discount(private val clock: Clock) {
    fun apply(order: Order): Money = if (clock.today() in order.promoDays) order.total * 0.9 else order.total
}
Вопрос 19 из 30
Предложенная правка для «Инвариант и генерация данных» звучит так: Добавить доменные generators, граничные распределения и сохранять seed упавшего прогона для воспроизведения. Какой недостаток важнее обсудить?
Вопрос 20 из 30
Почему реальный контейнер БД важнее in-memory замены?
KotlinИнтеграционные тесты · Реальная транзакция order/outbox
// Проследите фактическое выполнение без изменения кода.
@Test fun repository_commits_order_and_outbox() = withDatabaseContainer {
    val id = service.place(command)
    assertNotNull(orderTable.find(id))
    assertEquals(1, outboxTable.countFor(id))
}
Вопрос 21 из 30
Какое правило определяет поведение фрагмента «Сигналы качества в CI»?
KotlinТестирование и инструменты · Сигналы качества в CI
// На ревью требуется объяснить причину поведения.
// build.gradle.kts
tasks.test {
    useJUnitPlatform()
    testLogging { events("failed", "skipped") }
}
// static analysis + coverage + mutation report in CI
Вопрос 22 из 30
Как сделать ответственность во фрагменте «Управляемый lifecycle worker» понятной следующему разработчику?
KotlinАрхитектура и конкурентность · Управляемый lifecycle worker
// Сохраните назначение фрагмента, но укрепите его контракт.
import kotlinx.coroutines.*
class Worker(private val scope: CoroutineScope, private val queue: Queue) {
    fun start(): Job = scope.launch {
        queue.items.collect { process(it) }
    }
}
Вопрос 23 из 30
Какая небольшая правка заметно повышает надёжность «Внедрённые часы в unit-тесте»?
KotlinМодульные тесты · Внедрённые часы в unit-тесте
// Сохраните назначение фрагмента, но укрепите его контракт.
class Discount(private val clock: Clock) {
    fun apply(order: Order): Money = if (clock.today() in order.promoDays) order.total * 0.9 else order.total
}
Вопрос 24 из 30
Где упрощённое объяснение «Граница виртуальной задержки» перестаёт работать?
Вопрос 25 из 30
Какое утверждение точнее всего объясняет поведение фрагмента «Реальная транзакция order/outbox»?
KotlinИнтеграционные тесты · Реальная транзакция order/outbox
// На ревью требуется объяснить причину поведения.
@Test fun repository_commits_order_and_outbox() = withDatabaseContainer {
    val id = service.place(command)
    assertNotNull(orderTable.find(id))
    assertEquals(1, outboxTable.countFor(id))
}
Вопрос 26 из 30
Какая правка устраняет причину риска в «Сигналы качества в CI», а не только его проявление?
KotlinТестирование и инструменты · Сигналы качества в CI
// Сохраните назначение фрагмента, но укрепите его контракт.
// build.gradle.kts
tasks.test {
    useJUnitPlatform()
    testLogging { events("failed", "skipped") }
}
// static analysis + coverage + mutation report in CI
Вопрос 27 из 30
Что проверить отдельно, чтобы не принять «Управляемый lifecycle worker» за универсальное правило?
Вопрос 28 из 30
Какой соседний случай отличает устойчивое решение «Внедрённые часы в unit-тесте» от удачного примера?
Вопрос 29 из 30
Команда собирается передавать тестируемому коду dispatcher/scope с тем же scheduler и не смешивать его с реальными глобальными пулами. Что придётся учитывать после внедрения в «Граница виртуальной задержки»?
Вопрос 30 из 30
Чем такой тест полезнее нескольких примеров?
KotlinProperty-based подход · Инвариант и генерация данных
// Проследите фактическое выполнение без изменения кода.
class ReversePropertyTest : StringSpec({
    property("reverse twice") {
        checkAll<String> { s -> s.reversed().reversed() shouldBe s }
    }
})

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу