Как запускать спецификации последовательно
Я хочу создать несколько спецификаций, которые взаимодействуют с базой данных.
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 )
)
Я не тестировал, может ли это быть переопределено каждым подпроектом, поэтому суб-проект может параллельно выполнять свои тесты.