BeforeAndAfterAll
Stackable trait that can be mixed into suites that need methods invoked before and after executing the suite.
This trait allows code to be executed before and/or after all the tests and nested suites of a suite are run. This trait overrides run
and calls the beforeAll
method, then calls super.run
. After the super.run
invocation completes, whether it returns normally or completes abruptly with an exception, this trait's run
method will invoke afterAll
.
Trait BeforeAndAfterAll
defines beforeAll
and afterAll
methods that take no parameters. This trait's implementation of these methods do nothing.
For example, the following ExampleSpec
mixes in BeforeAndAfterAll
and in beforeAll
, creates and writes to a temp file. Each test class, ExampleSpec
and all its nested suites--OneSpec
, TwoSpec
, RedSpec
, and BlueSpec
--tests that the file exists. After all of the nested suites have executed, afterAll
is invoked, which deletes the file. (Note: if you're unfamiliar with the withFixture(OneArgTest)
approach to shared fixtures, check out the documentation for trait fixture.FlatSpec
.)
package org.scalatest.examples.beforeandafterall import org.scalatest._ import java.io._ trait TempFileExistsSpec extends fixture.FlatSpecLike { protected val tempFileName = "tmp.txt" type FixtureParam = File override def withFixture(test: OneArgTest) = { val file = new File(tempFileName) withFixture(test.toNoArgTest(file)) // loan the fixture to the test } "The temp file" should ("exist in " + suiteName) in { file => assert(file.exists) } } class OneSpec extends TempFileExistsSpec class TwoSpec extends TempFileExistsSpec class RedSpec extends TempFileExistsSpec class BlueSpec extends TempFileExistsSpec class ExampleSpec extends Suites( new OneSpec, new TwoSpec, new RedSpec, new BlueSpec ) with TempFileExistsSpec with BeforeAndAfterAll { // Set up the temp file needed by the test, taking // a file name from the config map override def beforeAll() { val writer = new FileWriter(tempFileName) try writer.write("Hello, suite of tests!") finally writer.close() } // Delete the temp file override def afterAll() { val file = new File(tempFileName) file.delete() } }
If you do supply a mapping for "tempFileName"
in the config map, you'll see that the temp file is available to all the tests:
scala> org.scalatest.run(new ExampleSpec)
ExampleSpec:
OneSpec:
The temp file
- should exist in OneSpec
TwoSpec:
The temp file
- should exist in TwoSpec
RedSpec:
The temp file
- should exist in RedSpec
BlueSpec:
The temp file
- should exist in BlueSpec
The temp file
- should exist in ExampleSpec
Note: this trait uses the Status
result of Suite
's "run" methods to ensure that the code in afterAll
is executed after all the tests and nested suites are executed even if a Distributor
is passed.
Note that it is not guaranteed that afterAll
is invoked from the same thread as beforeAll
, so if there's any shared state between beforeAll
and afterAll
you'll need to make sure they are synchronized correctly.
Attributes
- Graph
-
- Supertypes
- Self type