Как обеспечить выполнение теста после всех тестов в самом масштабном состоянии? - PullRequest
2 голосов
/ 30 сентября 2019

Я хочу проверить, что все методы REST API охватываются тестами. Все http-вызовы записываются в изменяемый набор, и у меня есть фрагмент кода, который проверяет соответствие между спецификацией и результирующим набором записанных вызовов API.

Я могу поместить эту проверку в отдельный test вконец FunSuite, и он будет выполнен после всех других тестов. Однако есть две проблемы: я должен скопировать и вставить его в каждый файл, который тестирует API, и убедиться, что он находится в конце файла.

Использование общей черты не работает: выполняются тесты из родительского классаперед тестами из детского класса. Помещение теста в afterAll также не работает: scalatest глотает все исключения (включая неудачи теста), добавленные в него.

Есть ли способ запустить какой-нибудь тест после всех других без шаблонного кода?

1 Ответ

2 голосов
/ 03 октября 2019

Лично я бы пошел с выделенным инструментом покрытия, таким как scoverage . Одним из преимуществ было бы избегание глобального состояния.

Тем не менее, в соответствии с вопросом, способ выполнить тест после всех тестов будет через Suites и BeforeAndAfterAll черты, такие как

import org.scalatest.{BeforeAndAfterAll, Suites, Matchers}

class AllSuites extends Suites(
  new FooSpec,
  new BarSpec,
) with BeforeAndAfterAll withy Matchers {

  override def afterAll(): Unit = {
    // matchers here as usual
  }
}

Вот игрушечный пример с глобальным состоянием согласно вопросу

AllSuites.scala

import org.scalatest.{BeforeAndAfterAll, Matchers, Suites}

object GlobalMutableState {
  val set = scala.collection.mutable.Set[Int]()
}

class AllSuites extends Suites(
  new HelloSpec,
  new GoodbyeSpec
) with BeforeAndAfterAll with Matchers {

  override def afterAll(): Unit = {
    GlobalMutableState.set should contain theSameElementsAs Set(3,2)
  }
}

HelloSpec.scala

@DoNotDiscover
class HelloSpec extends FlatSpec with Matchers {
  "The Hello object" should "say hello" in {
    GlobalMutableState.set.add(1)
    "hello" shouldEqual "hello"
  }
}

GoodbyeSpec.scala

@DoNotDiscover
class GoodbyeSpec extends FlatSpec with Matchers {
  "The Goodbye object" should "say goodbye" in {
    GlobalMutableState.set.add(2)
    "goodbye" shouldEqual "goodbye"
  }
}

Теперь выполнение sbt test дает что-то вроде

[info] example.AllSuites *** ABORTED ***
[info]   HashSet(1, 2) did not contain the same elements as Set(3, 2) (AllSuites.scala:15)
[info] HelloSpec:
[info] The Hello object
[info] - should say hello
[info] GoodbyeSpec:
[info] The Goodbye object
[info] - should say goodbye
[info] Run completed in 377 milliseconds.
[info] Total number of tests run: 2
[info] Suites: completed 2, aborted 1
[info] Tests: succeeded 2, failed 0, canceled 0, ignored 0, pending 0
[info] *** 1 SUITE ABORTED ***
[error] Error during tests:
[error]     example.AllSuites
[error] (Test / test) sbt.TestsFailedException: Tests unsuccessful
...