kotlintest中beforeEach和beforeClass怎么写
How to write beforeEach and beforeClass in kotlintest
给出的是 kotlin-test github docs 中的示例,但我在这里看不到 beforeEach 或 beforeClass 概念。我想明白,
- 如何在每次测试前执行一次code/method
- 如何在每次测试前执行一次 code/method class
class MyTests : StringSpec({
"length should return size of string" {
"hello".length shouldBe 5
}
"startsWith should test for a prefix" {
"world" should startWith("wor")
}
})
在 github 文档和 kotlin-test 框架源代码中做了一些研究后,下面是编写 beforeTest、beforeSpec、afterTest、afterSpec 的代码
class MyTest : StringSpec({
"test should run " {
"Hello".shouldHaveLength(4)
}
"test2 should run " {
"Hello World".shouldHaveLength(10)
}
}) {
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")
}
}
这看起来不太优雅,如果有什么方法可以让它变得优雅,请post它。
与您自己的回答@JTeam 非常相似,但使用 init {} 构造函数块来声明您的测试,然后您可以直接在 class.
中覆盖方法
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)
}
}
}
在 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
}
})
给出的是 kotlin-test github docs 中的示例,但我在这里看不到 beforeEach 或 beforeClass 概念。我想明白,
- 如何在每次测试前执行一次code/method
- 如何在每次测试前执行一次 code/method class
class MyTests : StringSpec({
"length should return size of string" {
"hello".length shouldBe 5
}
"startsWith should test for a prefix" {
"world" should startWith("wor")
}
})
在 github 文档和 kotlin-test 框架源代码中做了一些研究后,下面是编写 beforeTest、beforeSpec、afterTest、afterSpec 的代码
class MyTest : StringSpec({
"test should run " {
"Hello".shouldHaveLength(4)
}
"test2 should run " {
"Hello World".shouldHaveLength(10)
}
}) {
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")
}
}
这看起来不太优雅,如果有什么方法可以让它变得优雅,请post它。
与您自己的回答@JTeam 非常相似,但使用 init {} 构造函数块来声明您的测试,然后您可以直接在 class.
中覆盖方法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)
}
}
}
在 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
}
})