渐进式编程课
KMP 目录
第 61 课2026.09.24

精确测试异步任务在截止时间前不会提前完成,并在截止时执行。

第 61 课:比较边界前一毫秒与到期时刻

  • 日期:2026-09-24
  • 课程序号:第 61 课
  • 知识点:分段推进测试时钟

用途或适用场景

精确测试异步任务在截止时间前不会提前完成,并在截止时执行。

核心概念

先推进到 999 毫秒,再推进 1 毫秒到边界;advanceTimeBy 不执行恰好位于最终边界的任务,随后 runCurrent 才执行。

最小代码或操作示例

kotlin
@OptIn(ExperimentalCoroutinesApi::class)
@Test
fun checksBothSides() = runTest {
    var done = false
    launch { delay(1_000); done = true }
    runCurrent()
    advanceTimeBy(999)
    assertFalse(done)
    advanceTimeBy(1)
    assertFalse(done)
    runCurrent()
    assertTrue(done)
}

沿用第 59 课的 commonTest 依赖与导入。

3~5 分钟练习

把延迟改为 2 秒,并保持“到期前 1 毫秒”断言。

参考答案

将 delay 改为 2_000,第一次推进量改为 1_999,第二次仍推进 1 毫秒;最终 runCurrent() 后 done 为 true。

与上一课的联系

沿用第 60 课的 done、advanceTimeBy 和边界处的 runCurrent();本课只把一次推进拆为 999 毫秒加 1 毫秒,以验证边界两侧;完成后下一课可测试多个不同延迟任务的执行顺序。

时效校验

时效校验:2026-09-24(kotlinx-coroutines-test 1.11.0 官方 advanceTimeBy 与 runCurrent API;均标注实验性,示例显式 opt-in,未标注废弃)。

官方参考