You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotest嵌套测试中生命周期钩子执行顺序的疑问

Kotest嵌套测试场景下生命周期钩子执行顺序的疑问

我在使用Kotest 5.4.1版本时,对嵌套测试场景下的生命周期钩子执行顺序存在困惑,以下是测试示例代码:

import io.kotest.core.spec.style.DescribeSpec

class KotestTest : DescribeSpec({
    beforeSpec { println("beforeSpec") }
    afterSpec { println("afterSpec") }
    beforeAny { println("beforeAny") }
    afterAny { println("afterAny") }
    beforeContainer { println("beforeContainer") }
    afterContainer { println("afterContainer") }
    beforeEach { println("beforeEach") }
    afterEach { println("afterEach") }
    beforeTest { println("beforeTest") }
    afterTest { println("afterTest") }
    describe("1") {
        println("1")
        beforeAny { println("beforeAny 1") }
        afterAny { println("afterAny 1") }
        beforeContainer { println("beforeContainer 1") }
        afterContainer { println("afterContainer 1") }
        beforeEach { println("beforeEach 1") }
        afterEach { println("afterEach 1") }
        beforeTest { println("beforeTest 1") }
        afterTest { println("afterTest 1") }
        describe("2") {
            println("2")
            beforeAny { println("beforeAny 2") }
            afterAny { println("afterAny 2") }
            beforeContainer { println("beforeContainer 2") }
            afterContainer { println("afterContainer 2") }
            beforeEach { println("beforeEach 2") }
            afterEach { println("afterEach 2") }
            beforeTest { println("beforeTest 2") }
            afterTest { println("afterTest 2") }
            it("3") { println("3") }
        }
    }
})

运行上述测试后,得到的执行输出如下:

beforeSpec
beforeContainer
beforeAny
beforeTest
1
beforeContainer
beforeContainer 1
beforeAny
beforeAny 1
beforeTest
beforeTest 1
2
beforeEach
beforeEach 1
beforeEach 2
beforeAny
beforeAny 1
beforeAny 2
beforeTest
beforeTest 1
beforeTest 2
3
afterTest
afterTest 1
afterTest 2
afterAny
afterAny 1
afterAny 2
afterEach
afterEach 1
afterEach 2
afterTest
afterTest 1
afterAny
afterAny 1
afterContainer
afterContainer 1
afterTest
afterAny
afterContainer
afterSpec

基于以上输出,我有两个疑问:

  1. 是否有官方明确规则,规定beforeContainer、beforeAny、beforeTest,以及beforeEach、beforeAny、beforeTest的执行顺序?
  2. 我理解before类钩子是从外到内执行,但预期after类钩子应按相反顺序(从内到外)执行,当前的执行顺序是否属于Bug?

我们在项目中需要验证Mock调用,示例代码如下:

val mock = mockk<MyClass>()

afterEach { confirmVerified(mock); clearMocks(mock); }

describe("fun1") {
    beforeEach { every { mock.fun1()} returns 1 }
    afterEach { verify { mock.fun1()} }

    it("...") {...}
}

但由于当前的执行顺序,外层的afterEach会先执行,导致内部的验证逻辑无法正常工作。

内容的提问来源于stack exchange,提问作者Björn Peemöller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:27:30