Как написать 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")
    }
}

Это не выглядит элегантно, если есть способ сделать его элегантным, пожалуйста, напишите об этом.

Другие вопросы по тегам