如何在 kotlintest 中编写 beforeEach 和 beforeClass

JTe*_*eam 4 kotlin kotlintest

给出的是来自kotlin-test github docs的示例,但我在这里没有看到 beforeEach 或 beforeClass 概念。我想明白,

  • 如何在每次测试之前执行一次代码/方法
  • 如何在每个测试类之前执行一次代码/方法
class MyTests : StringSpec({
  "length should return size of string" {
    "hello".length shouldBe 5
  }
  "startsWith should test for a prefix" {
    "world" should startWith("wor")
  }
})
Run Code Online (Sandbox Code Playgroud)

mon*_*ack 10

与您自己的答案@JTeam 非常相似,但使用 init {} 构造函数块来声明您的测试,然后您可以直接在类中覆盖方法。

class MyTest : StringSpec() {

  override fun beforeTest(description: Description) {
    super.beforeTest(description)
    println("Before every spec/test case")
  }

  override fun beforeSpec(description: Description, spec: Spec) {
    super.beforeSpec(description, this)
    println("Before every test suite")
  }

  override fun afterTest(description: Description, result: TestResult) {
    super.afterTest(description, result)
    println("After every spec/test case")
  }

  override fun afterSpec(description: Description, spec: Spec) {
    super.afterSpec(description, spec)
    println("After every test suite")
  }

  init {
    "test should run " {
      "Hello".shouldHaveLength(4)
    }

    "test2 should run " {
      "Hello World".shouldHaveLength(10)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


tib*_*tof 7

在较新的版本中Kotest(我认为从 4.0.0 开始)有生命周期函数TestCofiguration,并且不再需要 init 块:

import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.string.shouldHaveLength

class MyTest : StringSpec({
    beforeTest {
        println("Before every spec/test case")
    }

    beforeSpec {
        println("Before every test suite")
    }

    afterTest {
        println("After every spec/test case")
    }

    afterSpec {
        println("After every test suite")
    }

    "test 1 " {
        println("run test 1")
        "Hello" shouldHaveLength 4
    }

    "test 2 " {
        println("run test 2")
        "Hello World" shouldHaveLength 10
    }
})
Run Code Online (Sandbox Code Playgroud)

更多信息