Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to run specifications sequentially

Tags:

scala

specs2

I want to create few specifications that interoperate with database.

class DocumentSpec extends mutable.Specification with BeforeAfterExample {
  sequential

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

  // examples
  // ...
}

Database is created and dropped before and after every example (which is executed sequentially). Everithing works as expected until there is only one spec that works with database. Because specifications are executed parallel, they interfere and fail.

I hope that I'm able to avoid this by instructing specs2 to run tests with side effects sequentially while keeping side effect free tests to run in parallel. Is it possible?

like image 707
Jeriho Avatar asked Feb 28 '13 21:02

Jeriho


3 Answers

I suppose you are using SBT? If so, check the documentation: http://www.scala-sbt.org/release/docs/Detailed-Topics/Parallel-Execution

The relevant SBT setting is parallelExecution. Add this to your project definition:

parallelExecution in Test := false
like image 133
Régis Jean-Gilles Avatar answered Nov 09 '22 05:11

Régis Jean-Gilles


If you want to run single Specification in specs2 sequentially just add sequential method call at the beginning of your Specification. For example:

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
    }
  }
} 

UPDATE: As @jsears correctly mentioned in the comments, this will make tests to run sequentially in a single spec! Other specs may still run in parallel.

like image 37
Ivan Mushketyk Avatar answered Nov 09 '22 06:11

Ivan Mushketyk


Meanwhile there is a better solution (http://www.scala-sbt.org/release/docs/Parallel-Execution.html):

sbt 0.12.0 introduces a general infrastructure for restricting task concurrency beyond the usual ordering declarations.

This configuration will run all tests sequential, also if they are in subprojects:

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

I haven't tested if this can be overridden by each sub-project, so the sub-project can run its tests in parallel.

like image 7
pme Avatar answered Nov 09 '22 04:11

pme