Как написать beforeEach и beforeClass в котлинтест
Приведен пример из документации github kotlin-test, но я не вижу здесь концепций 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")
}
})
3 ответа
Решение
Очень похоже на ваш собственный ответ @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)
}
}
}
В более новых версиях Kotest (думаю, что начиная с 4.0.0) на
TestCofiguration
и больше нет необходимости в блоке инициализации:
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
}
})
После некоторых исследований исходного кода платформы github docs и 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")
}
}
Это не выглядит элегантно, если есть способ сделать его элегантным, пожалуйста, напишите об этом.