Как запускать спецификации последовательно

Я хочу создать несколько спецификаций, которые взаимодействуют с базой данных.

class DocumentSpec extends mutable.Specification with BeforeAfterExample {
  sequential

  def before() = {createDB()}
  def after() = {dropDB()}

  // examples
  // ...
}

База данных создается и отбрасывается до и после каждого примера (который выполняется последовательно). Everithing работает так, как ожидается, пока не будет только один spec, который работает с базой данных. Поскольку спецификации выполняются параллельно, они мешают и терпят неудачу.

Надеюсь, что я смогу избежать этого, поручив specs2 последовательно запускать тесты с побочными эффектами, одновременно проверяя параллельные побочные эффекты. Возможно ли это?

Ответы

Ответ 1

Я полагаю, вы используете SBT? Если да, проверьте документацию: http://www.scala-sbt.org/release/docs/Detailed-Topics/Parallel-Execution

Соответствующая настройка SBT parallelExecution. Добавьте это в свое определение проекта:

parallelExecution in Test := false

Ответ 2

Если вы хотите запускать единую спецификацию в specs2 последовательно, просто добавьте вызов метода sequential в начале вашей спецификации. Например:

class MyTest extends Specification {
  // Set sequential execution
  sequential

  // This tests will be executed sequentially
  "my test" should {
    "add numbers" in {
      (1 + 1) should be equalTo 2
    }

    "multiply numbers" in {
      (2 * 2) should be equalTo 4
    }
  }
} 

Ответ 3

Между тем есть лучшее решение (http://www.scala-sbt.org/release/docs/Parallel-Execution.html):

sbt 0.12.0 вводит общую инфраструктуру для ограничения задачи concurrency за пределы обычных заявлений о заказе.

Эта конфигурация будет запускать все тесты последовательно, также если они находятся в подпроектах:

concurrentRestrictions in Global := Seq(
  Tags.limit(Tags.CPU, 2),
  Tags.limit(Tags.Network, 10),
  Tags.limit(Tags.Test, 1),
  Tags.limitAll( 15 )
)

Я не тестировал, может ли это быть переопределено каждым подпроектом, поэтому суб-проект может параллельно выполнять свои тесты.