Assert that a boolean condition, described in String
message
, is true.
Assert that a boolean condition, described in String
message
, is true.
If the condition is true
, this method returns normally.
Else, it throws TestFailedException
with a helpful error message
appended with the String
obtained by invoking toString
on the
specified clue
as the exception's detail message.
This method is implemented in terms of a Scala macro that will generate a more helpful error message for expressions of this form:
At this time, any other form of expression will just get a TestFailedException
with message saying the given
expression was false. In the future, we will enhance this macro to give helpful error messages in more situations.
In ScalaTest 2.0, however, this behavior was sufficient to allow the ===
that returns Boolean
to be the default in tests. This makes ===
consistent between tests and production
code.
the boolean condition to assert
An objects whose toString
method returns a message to include in a failure report.
NullArgumentException
if message
is null
.
TestFailedException
if the condition is false
.
Assert that a boolean condition is true.
Assert that a boolean condition is true.
If the condition is true
, this method returns normally.
Else, it throws TestFailedException
.
This method is implemented in terms of a Scala macro that will generate a more helpful error message for expressions of this form:
At this time, any other form of expression will get a TestFailedException
with message saying the given
expression was false. In the future, we will enhance this macro to give helpful error messages in more situations.
In ScalaTest 2.0, however, this behavior was sufficient to allow the ===
that returns Boolean
to be the default in tests. This makes ===
consistent between tests and production
code.
the boolean condition to assert
TestFailedException
if the condition is false
.
Asserts that a given string snippet of code passes both the Scala parser and type checker.
Asserts that a given string snippet of code passes both the Scala parser and type checker.
You can use this to make sure a snippet of code compiles:
assertCompiles("val a: Int = 1")
Although assertCompiles
is implemented with a macro that determines at compile time whether
the snippet of code represented by the passed string compiles, errors (i.e.,
snippets of code that do not compile) are reported as test failures at runtime.
the snippet of code that should compile
Asserts that a given string snippet of code does not pass either the Scala parser or type checker.
Asserts that a given string snippet of code does not pass either the Scala parser or type checker.
Often when creating libraries you may wish to ensure that certain arrangements of code that
represent potential “user errors” do not compile, so that your library is more error resistant.
ScalaTest's Assertions
trait includes the following syntax for that purpose:
assertDoesNotCompile("val a: String = \"a string")
Although assertDoesNotCompile
is implemented with a macro that determines at compile time whether
the snippet of code represented by the passed string doesn't compile, errors (i.e.,
snippets of code that do compile) are reported as test failures at runtime.
Note that the difference between assertTypeError
and assertDoesNotCompile
is
that assertDoesNotCompile
will succeed if the given code does not compile for any reason,
whereas assertTypeError
will only succeed if the given code does not compile because of
a type error. If the given code does not compile because of a syntax error, for example, assertDoesNotCompile
will return normally but assertTypeError
will throw a TestFailedException
.
the snippet of code that should not type check
Assert that the value passed as expected
equals the value passed as actual
.
Assert that the value passed as expected
equals the value passed as actual
.
If the actual
value equals the expected
value
(as determined by ==
), assertResult
returns
normally. Else, assertResult
throws a
TestFailedException
whose detail message includes the expected and actual values.
the expected value
the actual value, which should equal the passed expected
value
TestFailedException
if the passed actual
value does not equal the passed expected
value.
Assert that the value passed as expected
equals the value passed as actual
.
Assert that the value passed as expected
equals the value passed as actual
.
If the actual
equals the expected
(as determined by ==
), assertResult
returns
normally. Else, if actual
is not equal to expected
, assertResult
throws a
TestFailedException
whose detail message includes the expected and actual values, as well as the String
obtained by invoking toString
on the passed clue
.
the expected value
An object whose toString
method returns a message to include in a failure report.
the actual value, which should equal the passed expected
value
TestFailedException
if the passed actual
value does not equal the passed expected
value.
Ensure that an expected exception is thrown by the passed function value.
Ensure that an expected exception is thrown by the passed function value. The thrown exception must be an instance of the
type specified by the type parameter of this method. This method invokes the passed
function. If the function throws an exception that's an instance of the specified type,
this method returns Succeeded
. Else, whether the passed function returns normally
or completes abruptly with a different exception, this method throws TestFailedException
.
Note that the type specified as this method's type parameter may represent any subtype of
AnyRef
, not just Throwable
or one of its subclasses. In
Scala, exceptions can be caught based on traits they implement, so it may at times make sense
to specify a trait that the intercepted exception's class must mix in. If a class instance is
passed for a type that could not possibly be used to catch an exception (such as String
,
for example), this method will complete abruptly with a TestFailedException
.
Also note that the difference between this method and intercept
is that this method
does not return the expected exception, so it does not let you perform further assertions on
that exception. Instead, this method returns Succeeded
, which means it can
serve as the last statement in an async- or safe-style suite. It also indicates to the reader
of the code that nothing further is expected about the thrown exception other than its type.
The recommended usage is to use assertThrows
by default, intercept
only when you
need to inspect the caught exception further.
the function value that should throw the expected exception
an implicit ClassTag
representing the type of the specified
type parameter.
the Succeeded
singleton, if an exception of the expected type is thrown
TestFailedException
if the passed function does not complete abruptly with an exception
that's an instance of the specified type.
Asserts that a given string snippet of code does not pass the Scala type checker, failing if the given snippet does not pass the Scala parser.
Asserts that a given string snippet of code does not pass the Scala type checker, failing if the given snippet does not pass the Scala parser.
Often when creating libraries you may wish to ensure that certain arrangements of code that
represent potential “user errors” do not compile, so that your library is more error resistant.
ScalaTest's Assertions
trait includes the following syntax for that purpose:
assertTypeError("val a: String = 1")
Although assertTypeError
is implemented with a macro that determines at compile time whether
the snippet of code represented by the passed string type checks, errors (i.e.,
snippets of code that do type check) are reported as test failures at runtime.
Note that the difference between assertTypeError
and assertDoesNotCompile
is
that assertDoesNotCompile
will succeed if the given code does not compile for any reason,
whereas assertTypeError
will only succeed if the given code does not compile because of
a type error. If the given code does not compile because of a syntax error, for example, assertDoesNotCompile
will return normally but assertTypeError
will throw a TestFailedException
.
the snippet of code that should not type check
Assume that a boolean condition, described in String
message
, is true.
Assume that a boolean condition, described in String
message
, is true.
If the condition is true
, this method returns normally.
Else, it throws TestCanceledException
with a helpful error message
appended with String
obtained by invoking toString
on the
specified clue
as the exception's detail message.
This method is implemented in terms of a Scala macro that will generate a more helpful error message for expressions of this form:
At this time, any other form of expression will just get a TestCanceledException
with message saying the given
expression was false. In the future, we will enhance this macro to give helpful error messages in more situations.
In ScalaTest 2.0, however, this behavior was sufficient to allow the ===
that returns Boolean
to be the default in tests. This makes ===
consistent between tests and production
code.
the boolean condition to assume
An objects whose toString
method returns a message to include in a failure report.
NullArgumentException
if message
is null
.
TestCanceledException
if the condition is false
.
Assume that a boolean condition is true.
Assume that a boolean condition is true.
If the condition is true
, this method returns normally.
Else, it throws TestCanceledException
.
This method is implemented in terms of a Scala macro that will generate a more helpful error message for expressions of this form:
At this time, any other form of expression will just get a TestCanceledException
with message saying the given
expression was false. In the future, we will enhance this macro to give helpful error messages in more situations.
In ScalaTest 2.0, however, this behavior was sufficient to allow the ===
that returns Boolean
to be the default in tests. This makes ===
consistent between tests and production
code.
the boolean condition to assume
TestCanceledException
if the condition is false
.
Throws TestCanceledException
, with the passed
Throwable
cause, to indicate a test failed.
Throws TestCanceledException
, with the passed
Throwable
cause, to indicate a test failed.
The getMessage
method of the thrown TestCanceledException
will return cause.toString
.
a Throwable
that indicates the cause of the cancellation.
NullArgumentException
if cause
is null
Throws TestCanceledException
, with the passed
String
message
as the exception's detail
message and Throwable
cause, to indicate a test failed.
Throws TestCanceledException
, with the passed
String
message
as the exception's detail
message and Throwable
cause, to indicate a test failed.
A message describing the failure.
A Throwable
that indicates the cause of the failure.
NullArgumentException
if message
or cause
is null
Throws TestCanceledException
, with the passed
String
message
as the exception's detail
message, to indicate a test was canceled.
Throws TestCanceledException
, with the passed
String
message
as the exception's detail
message, to indicate a test was canceled.
A message describing the cancellation.
NullArgumentException
if message
is null
Throws TestCanceledException
to indicate a test was canceled.
Throws TestCanceledException
to indicate a test was canceled.
The total number of tests that are expected to run when this Suite
's run
method is invoked.
The total number of tests that are expected to run when this Suite
's run
method is invoked.
This trait's implementation of this method returns the sum of:
testNames
List
, minus the number of tests marked as ignored and
any tests that are exluded by the passed Filter
expectedTestCount
on every nested Suite
contained in
nestedSuites
a Filter
with which to filter tests to count based on their tags
Throws TestFailedException
, with the passed
Throwable
cause, to indicate a test failed.
Throws TestFailedException
, with the passed
Throwable
cause, to indicate a test failed.
The getMessage
method of the thrown TestFailedException
will return cause.toString
.
a Throwable
that indicates the cause of the failure.
NullArgumentException
if cause
is null
Throws TestFailedException
, with the passed
String
message
as the exception's detail
message and Throwable
cause, to indicate a test failed.
Throws TestFailedException
, with the passed
String
message
as the exception's detail
message and Throwable
cause, to indicate a test failed.
A message describing the failure.
A Throwable
that indicates the cause of the failure.
NullArgumentException
if message
or cause
is null
Throws TestFailedException
, with the passed
String
message
as the exception's detail
message, to indicate a test failed.
Throws TestFailedException
, with the passed
String
message
as the exception's detail
message, to indicate a test failed.
A message describing the failure.
NullArgumentException
if message
is null
Throws TestFailedException
to indicate a test failed.
Throws TestFailedException
to indicate a test failed.
Intercept and return an exception that's expected to be thrown by the passed function value.
Intercept and return an exception that's expected to
be thrown by the passed function value. The thrown exception must be an instance of the
type specified by the type parameter of this method. This method invokes the passed
function. If the function throws an exception that's an instance of the specified type,
this method returns that exception. Else, whether the passed function returns normally
or completes abruptly with a different exception, this method throws TestFailedException
.
Note that the type specified as this method's type parameter may represent any subtype of
AnyRef
, not just Throwable
or one of its subclasses. In
Scala, exceptions can be caught based on traits they implement, so it may at times make sense
to specify a trait that the intercepted exception's class must mix in. If a class instance is
passed for a type that could not possibly be used to catch an exception (such as String
,
for example), this method will complete abruptly with a TestFailedException
.
Also note that the difference between this method and assertThrows
is that this method
returns the expected exception, so it lets you perform further assertions on
that exception. By contrast, the assertThrows
method returns Succeeded
, which means it can
serve as the last statement in an async- or safe-style suite. assertThrows
also indicates to the reader
of the code that nothing further is expected about the thrown exception other than its type.
The recommended usage is to use assertThrows
by default, intercept
only when you
need to inspect the caught exception further.
the function value that should throw the expected exception
an implicit ClassTag
representing the type of the specified
type parameter.
the intercepted exception, if it is of the expected type
TestFailedException
if the passed function does not complete abruptly with an exception
that's an instance of the specified type.
An immutable IndexedSeq
of this Suite
object's nested Suite
s.
An immutable IndexedSeq
of this Suite
object's nested Suite
s. If this Suite
contains no nested Suite
s,
this method returns an empty IndexedSeq
. This trait's implementation of this method returns an empty List
.
Throws TestPendingException
to indicate a test is pending.
Throws TestPendingException
to indicate a test is pending.
A pending test is one that has been given a name but is not yet implemented. The purpose of pending tests is to facilitate a style of testing in which documentation of behavior is sketched out before tests are written to verify that behavior (and often, the before the behavior of the system being tested is itself implemented). Such sketches form a kind of specification of what tests and functionality to implement later.
To support this style of testing, a test can be given a name that specifies one
bit of behavior required by the system being tested. The test can also include some code that
sends more information about the behavior to the reporter when the tests run. At the end of the test,
it can call method pending
, which will cause it to complete abruptly with TestPendingException
.
Because tests in ScalaTest can be designated as pending with TestPendingException
, both the test name and any information
sent to the reporter when running the test can appear in the report of a test run. (In other words,
the code of a pending test is executed just like any other test.) However, because the test completes abruptly
with TestPendingException
, the test will be reported as pending, to indicate
the actual test, and possibly the functionality it is intended to test, has not yet been implemented.
Note: This method always completes abruptly with a TestPendingException
. Thus it always has a side
effect. Methods with side effects are usually invoked with parentheses, as in pending()
. This
method is defined as a parameterless method, in flagrant contradiction to recommended Scala style, because it
forms a kind of DSL for pending tests. It enables tests in suites such as FunSuite
or FunSpec
to be denoted by placing "(pending)
" after the test name, as in:
test("that style rules are not laws") (pending)
Readers of the code see "pending" in parentheses, which looks like a little note attached to the test name to indicate
it is pending. Whereas "(pending())
looks more like a method call, "(pending)
" lets readers
stay at a higher level, forgetting how it is implemented and just focusing on the intent of the programmer who wrote the code.
Execute the passed block of code, and if it completes abruptly, throw TestPendingException
, else
throw TestFailedException
.
Execute the passed block of code, and if it completes abruptly, throw TestPendingException
, else
throw TestFailedException
.
This method can be used to temporarily change a failing test into a pending test in such a way that it will
automatically turn back into a failing test once the problem originally causing the test to fail has been fixed.
At that point, you need only remove the pendingUntilFixed
call. In other words, a
pendingUntilFixed
surrounding a block of code that isn't broken is treated as a test failure.
The motivation for this behavior is to encourage people to remove pendingUntilFixed
calls when
there are no longer needed.
This method facilitates a style of testing in which tests are written before the code they test. Sometimes you may
encounter a test failure that requires more functionality than you want to tackle without writing more tests. In this
case you can mark the bit of test code causing the failure with pendingUntilFixed
. You can then write more
tests and functionality that eventually will get your production code to a point where the original test won't fail anymore.
At this point the code block marked with pendingUntilFixed
will no longer throw an exception (because the
problem has been fixed). This will in turn cause pendingUntilFixed
to throw TestFailedException
with a detail message explaining you need to go back and remove the pendingUntilFixed
call as the problem orginally
causing your test code to fail has been fixed.
a block of code, which if it completes abruptly, should trigger a TestPendingException
TestPendingException
if the passed block of code completes abruptly with an Exception
or AssertionError
The fully qualified class name of the rerunner to rerun this suite.
The fully qualified class name of the rerunner to rerun this suite. This implementation will look at this.getClass and see if it is either an accessible Suite, or it has a WrapWith annotation. If so, it returns the fully qualified class name wrapped in a Some, or else it returns None.
Runs this suite of tests.
Runs this suite of tests.
If testName
is None
, this trait's implementation of this method
calls these two methods on this object in this order:
runNestedSuites
runTests
If testName
is defined, then this trait's implementation of this method
calls runTests
, but does not call runNestedSuites
. This behavior
is part of the contract of this method. Subclasses that override run
must take
care not to call runNestedSuites
if testName
is defined. (The
OneInstancePerTest
trait depends on this behavior, for example.)
Subclasses and subtraits that override this run
method can implement them without
invoking either the runTests
or runNestedSuites
methods, which
are invoked by this trait's implementation of this method. It is recommended, but not required,
that subclasses and subtraits that override run
in a way that does not
invoke runNestedSuites
also override runNestedSuites
and make it
final. Similarly it is recommended, but not required,
that subclasses and subtraits that override run
in a way that does not
invoke runTests
also override runTests
(and runTest
,
which this trait's implementation of runTests
calls) and make it
final. The implementation of these final methods can either invoke the superclass implementation
of the method, or throw an UnsupportedOperationException
if appropriate. The
reason for this recommendation is that ScalaTest includes several traits that override
these methods to allow behavior to be mixed into a Suite
. For example, trait
BeforeAndAfterEach
overrides runTests
s. In a Suite
subclass that no longer invokes runTests
from run
, the
BeforeAndAfterEach
trait is not applicable. Mixing it in would have no effect.
By making runTests
final in such a Suite
subtrait, you make
the attempt to mix BeforeAndAfterEach
into a subclass of your subtrait
a compiler error. (It would fail to compile with a complaint that BeforeAndAfterEach
is trying to override runTests
, which is a final method in your trait.)
an optional name of one test to run. If None
, all relevant tests should be run.
I.e., None
acts like a wildcard that means run all relevant tests in this Suite
.
the Args
for this run
a Status
object that indicates when all tests and nested suites started by this method have completed, and whether or not a failure occurred.
IllegalArgumentException
if testName
is defined, but no test with the specified test name
exists in this Suite
NullArgumentException
if any passed parameter is null
.
Run zero to many of this Suite
's nested Suite
s.
Run zero to many of this Suite
's nested Suite
s.
If the passed distributor
is None
, this trait's
implementation of this method invokes run
on each
nested Suite
in the List
obtained by invoking nestedSuites
.
If a nested Suite
's run
method completes abruptly with an exception, this trait's implementation of this
method reports that the Suite
aborted and attempts to run the
next nested Suite
.
If the passed distributor
is defined, this trait's implementation
puts each nested Suite
into the Distributor
contained in the Some
, in the order in which the
Suite
s appear in the List
returned by nestedSuites
, passing
in a new Tracker
obtained by invoking nextTracker
on the Tracker
passed to this method.
Implementations of this method are responsible for ensuring SuiteStarting
events
are fired to the Reporter
before executing any nested Suite
, and either SuiteCompleted
or SuiteAborted
after executing any nested Suite
.
the Args
for this run
a Status
object that indicates when all nested suites started by this method have completed, and whether or not a failure occurred.
NullArgumentException
if any passed parameter is null
.
Run a test.
Run a test.
This trait's implementation of this method simply returns SucceededStatus
and has no other effect.
the name of one test to run.
the Args
for this run
a Status
object that indicates when the test started by this method has completed, and whether or not it failed .
IllegalArgumentException
if testName
is defined, but no test with the specified test name
exists in this Suite
NullArgumentException
if any of testName
or args
is null
.
Run zero to many of this Suite
's tests.
Run zero to many of this Suite
's tests.
This method takes a testName
parameter that optionally specifies a test to invoke.
If testName
is defined, this trait's implementation of this method
invokes runTest
on this object, passing in:
testName
- the String
value of the testName
Option
passed
to this methodreporter
- the Reporter
passed to this method, or one that wraps and delegates to itstopper
- the Stopper
passed to this method, or one that wraps and delegates to itconfigMap
- the configMap
Map
passed to this method, or one that wraps and delegates to itThis method takes a Filter
, which encapsulates an optional Set
of tag names that should be included
(tagsToInclude
) and a Set
that should be excluded (tagsToExclude
), when deciding which
of this Suite
's tests to run.
If tagsToInclude
is None
, all tests will be run
except those those belonging to tags listed in the tagsToExclude
Set
. If tagsToInclude
is defined, only tests
belonging to tags mentioned in the tagsToInclude
Set
, and not mentioned in the tagsToExclude
Set
will be run. However, if testName
is defined, tagsToInclude
and tagsToExclude
are essentially ignored.
Only if testName
is None
will tagsToInclude
and tagsToExclude
be consulted to
determine which of the tests named in the testNames
Set
should be run. This trait's implementation
behaves this way, and it is part of the general contract of this method, so all overridden forms of this method should behave
this way as well. For more information on test tags, see the main documentation for this trait and for class Filter
.
Note that this means that even if a test is marked as ignored, for example a test method in a Suite
annotated with
org.scalatest.Ignore
, if that test name is passed as testName
to runTest
, it will be invoked
despite the Ignore
annotation.
If testName
is None
, this trait's implementation of this method
invokes testNames
on this Suite
to get a Set
of names of tests to potentially run.
(A testNames
value of None
essentially acts as a wildcard that means all tests in
this Suite
that are selected by tagsToInclude
and tagsToExclude
should be run.)
For each test in the testName
Set
, in the order
they appear in the iterator obtained by invoking the elements
method on the Set
, this trait's implementation
of this method checks whether the test should be run based on the Filter
.
If so, this implementation invokes runTest
, passing in:
testName
- the String
name of the test to run (which will be one of the names in the testNames
Set
)reporter
- the Reporter
passed to this method, or one that wraps and delegates to itstopper
- the Stopper
passed to this method, or one that wraps and delegates to itconfigMap
- the configMap
passed to this method, or one that wraps and delegates to itIf a test is marked with the org.scalatest.Ignore
tag, implementations
of this method are responsible for ensuring a TestIgnored
event is fired for that test
and that runTest
is not called for that test.
an optional name of one test to run. If None
, all relevant tests should be run.
I.e., None
acts like a wildcard that means run all relevant tests in this Suite
.
the Args
for this run
a Status
object that indicates when all tests started by this method have completed, and whether or not a failure occurred.
IllegalArgumentException
if testName
is defined, but no test with the specified test name
exists in this Suite
NullArgumentException
if any of the passed parameters is null
.
Suite style name.
Suite style name.
org.scalatest.Suite
The Succeeded
singleton.
The Succeeded
singleton.
You can use succeed
to solve a type error when an async test
does not end in either Future[Assertion]
or Assertion
.
Because Assertion
is a type alias for Succeeded.type
,
putting succeed
at the end of a test body (or at the end of a
function being used to map the final future of a test body) will solve
the type error.
A string ID for this Suite
that is intended to be unique among all suites reported during a run.
A string ID for this Suite
that is intended to be unique among all suites reported during a run.
This trait's
implementation of this method returns the fully qualified name of this object's class.
Each suite reported during a run will commonly be an instance of a different Suite
class,
and in such cases, this default implementation of this method will suffice. However, in special cases
you may need to override this method to ensure it is unique for each reported suite. For example, if you write
a Suite
subclass that reads in a file whose name is passed to its constructor and dynamically
creates a suite of tests based on the information in that file, you will likely need to override this method
in your Suite
subclass, perhaps by appending the pathname of the file to the fully qualified class name.
That way if you run a suite of tests based on a directory full of these files, you'll have unique suite IDs for
each reported suite.
The suite ID is intended to be unique, because ScalaTest does not enforce that it is unique. If it is not unique, then you may not be able to uniquely identify a particular test of a particular suite. This ability is used, for example, to dynamically tag tests as having failed in the previous run when rerunning only failed tests.
this Suite
object's ID.
A user-friendly suite name for this Suite
.
A user-friendly suite name for this Suite
.
This trait's
implementation of this method returns the simple name of this object's class. This
trait's implementation of runNestedSuites
calls this method to obtain a
name for Report
s to pass to the suiteStarting
, suiteCompleted
,
and suiteAborted
methods of the Reporter
.
this Suite
object's suite name.
A Map
whose keys are String
names of tests that are tagged and
whose associated values are the Set
of tag names for the test.
A Map
whose keys are String
names of tests that are tagged and
whose associated values are the Set
of tag names for the test. If a test has no associated tags, its name
does not appear as a key in the returned Map
. If this Suite
contains no tests with tags, this
method returns an empty Map
.
This trait's implementation of this method uses Java reflection to discover any Java annotations attached to its test methods. The
fully qualified name of each unique annotation that extends TagAnnotation
is considered a tag. This trait's
implementation of this method, therefore, places one key/value pair into to the
Map
for each test for which a tag annotation is discovered through reflection.
In addition to test methods annotations, this trait's implementation will also auto-tag test methods with class level annotations. For example, if you annotate @Ignore at the class level, all test methods in the class will be auto-annotated with @Ignore.
Subclasses may override this method to define and/or discover tags in a custom manner, but overriding method implementations
should never return an empty Set
as a value. If a test has no tags, its name should not appear as a key in the
returned Map
.
Provides a TestData
instance for the passed test name, given the passed config map.
Provides a TestData
instance for the passed test name, given the passed config map.
This method is used to obtain a TestData
instance to pass to withFixture(NoArgTest)
and withFixture(OneArgTest)
and the beforeEach
and afterEach
methods
of trait BeforeAndAfterEach
.
the name of the test for which to return a TestData
instance
the config map to include in the returned TestData
a TestData
instance for the specified test, which includes the specified config map
A Set
of test names.
A Set
of test names. If this Suite
contains no tests, this method returns an empty Set
.
This trait's implementation of this method returns an empty Set
.
Executes the block of code passed as the second parameter, and, if it
completes abruptly with a ModifiableMessage
exception,
prepends the "clue" string passed as the first parameter to the beginning of the detail message
of that thrown exception, then rethrows it.
Executes the block of code passed as the second parameter, and, if it
completes abruptly with a ModifiableMessage
exception,
prepends the "clue" string passed as the first parameter to the beginning of the detail message
of that thrown exception, then rethrows it. If clue does not end in a white space
character, one space will be added
between it and the existing detail message (unless the detail message is
not defined).
This method allows you to add more information about what went wrong that will be reported when a test fails. Here's an example:
withClue("(Employee's name was: " + employee.name + ")") { intercept[IllegalArgumentException] { employee.getTask(-1) } }
If an invocation of intercept
completed abruptly with an exception, the resulting message would be something like:
(Employee's name was Bob Jones) Expected IllegalArgumentException to be thrown, but no exception was thrown
NullArgumentException
if the passed clue
is null
(Since version 3.1.0) The conversionCheckedConstraint method has been deprecated and will be removed in a future version of ScalaTest. It is no longer needed now that the deprecation period of ConversionCheckedTripleEquals has expired. It will not be replaced.
(Since version 3.1.0) The convertEquivalenceToAToBConversionConstraint method has been deprecated and will be removed in a future version of ScalaTest. It is no longer needed now that the deprecation period of ConversionCheckedTripleEquals has expired. It will not be replaced.
(Since version 3.1.0) The convertEquivalenceToBToAConversionConstraint method has been deprecated and will be removed in a future version of ScalaTest. It is no longer needed now that the deprecation period of ConversionCheckedTripleEquals has expired. It will not be replaced.
(Since version 3.1.0) The lowPriorityConversionCheckedConstraint method has been deprecated and will be removed in a future version of ScalaTest. It is no longer needed now that the deprecation period of ConversionCheckedTripleEquals has expired. It will not be replaced.
A suite of tests. A
Suite
instance encapsulates a conceptual suite (i.e., a collection) of tests.This trait provides an interface composed of "lifecycle methods" that allow suites of tests to be run. Its implementation enables a default way of writing and executing tests. Subtraits and subclasses can override
Suite
's lifecycle methods to enable other ways of writing and executing tests.Nested suites
A
Suite
can refer to a collection of otherSuite
s, which are called nestedSuite
s. Those nestedSuite
s can in turn have their own nestedSuite
s, and so on. Large test suites can be organized, therefore, as a tree of nestedSuite
s. This trait'srun
method, in addition to invoking its test methods, invokesrun
on each of its nestedSuite
s.A
List
of aSuite
's nestedSuite
s can be obtained by invoking itsnestedSuites
method. If you wish to create aSuite
that serves as a container for nestedSuite
s, whether or not it has test methods of its own, simply overridenestedSuites
to return aList
of the nestedSuite
s. Because this is a common use case, ScalaTest provides a convenienceSuites
class, which takes a variable number of nestedSuite
s as constructor parameters. Here's an example:If you now run
ASCIISuite
:You will see reports printed to the standard output that indicate the nested suites—
ASuite
,BSuite
, andCSuite
—were run:ASCIISuite: ASuite: - A should have ASCII value 41 hex - a should have ASCII value 61 hex BSuite: - B should have ASCII value 42 hex - b should have ASCII value 62 hex CSuite: - C should have ASCII value 43 hex - c should have ASCII value 63 hex
Note that
Runner
can discoverSuite
s automatically, so you need not necessarily define nestedSuites
explicitly. See the documentation forRunner
for more information.The config map
In some cases you may need to pass information to a suite of tests. For example, perhaps a suite of tests needs to grab information from a file, and you want to be able to specify a different filename during different runs. You can accomplish this in ScalaTest by passing the filename in a config map of key-value pairs, which is passed to
run
as aConfigMap
. The values in the config map are called "config objects," because they can be used to configure suites, reporters, and tests.You can specify a string config object is via the ScalaTest
Runner
, either via the command line or ScalaTest's ant task. (See the documentation for Runner for information on how to specify config objects on the command line.) The config map is passed torun
,runNestedSuites
,runTests
, andrunTest
, so one way to access it in your suite is to override one of those methods. If you need to use the config map inside your tests, you can access it from theNoArgTest
passed towithFixture
, or theOneArgTest
passed towithFixture
in the traits in theorg.scalatest.fixture
package. (See the documentation forFixtureSuite
for instructions on how to access the config map in tests.)Executing suites in parallel
The
run
method takes as one of its parameters an optionalDistributor
. If aDistributor
is passed in, this trait's implementation ofrun
puts its nestedSuite
s into the distributor rather than executing them directly. The caller ofrun
is responsible for ensuring that some entity runs theSuite
s placed into the distributor. The-P
command line parameter toRunner
, for example, will causeSuite
s put into theDistributor
to be run in parallel via a pool of threads. If you wish to execute the tests themselves in parallel, mix inParallelTestExecution
."Run-aborting" exceptions
The Javadoc documentation for
java.lang.Error
states:Because
Error
s are used to denote serious errors, traitSuite
and its subtypes in the ScalaTest API do not always treat a test that completes abruptly with anError
as a test failure, but sometimes as an indication that serious problems have arisen that should cause the run to abort. For example, if a test completes abruptly with anOutOfMemoryError
, it will not be reported as a test failure, but will instead cause the run to abort. Because not everyone usesError
s only to represent serious problems, however, ScalaTest only behaves this way for the following run-aborting exception types (and their subclasses):java.lang.annotation.AnnotationFormatError
java.awt.AWTError
java.nio.charset.CoderMalfunctionError
javax.xml.parsers.FactoryConfigurationError
java.lang.LinkageError
java.lang.ThreadDeath
javax.xml.transform.TransformerFactoryConfigurationError
java.lang.VirtualMachineError
The previous list includes all
Error
s that exist as part of Java 1.5 API, excludingjava.lang.AssertionError
. ScalaTest does treat a thrownAssertionError
as an indication of a test failure. In addition, any otherError
that is not an instance of a type mentioned in the previous list will be caught by theSuite
traits in the ScalaTest API and reported as the cause of a test failure.Although trait
Suite
and all its subtypes in the ScalaTest API consistently behave this way with regard toError
s, this behavior is not required by the contract ofSuite
. Subclasses and subtraits that you define, for example, may treat allError
s as test failures, or indicate errors in some other way that has nothing to do with exceptions.Extensibility
Trait
Suite
provides default implementations of its methods that should be sufficient for most applications, but many methods can be overridden when desired. Here's a summary of the methods that are intended to be overridden:run
- override this method to define custom ways to run suites of tests.runNestedSuites
- override this method to define custom ways to run nested suites.runTests
- override this method to define custom ways to run a suite's tests.runTest
- override this method to define custom ways to run a single named test.testNames
- override this method to specify theSuite
's test names in a custom way.tags
- override this method to specify theSuite
's test tags in a custom way.nestedSuites
- override this method to specify theSuite
's nestedSuite
s in a custom way.suiteName
- override this method to specify theSuite
's name in a custom way.expectedTestCount
- override this method to count thisSuite
's expected tests in a custom way.For example, this trait's implementation of
testNames
performs reflection to discover methods starting withtest
, and places these in aSet
whose iterator returns the names in alphabetical order. If you wish to run tests in a different order in a particularSuite
, perhaps because a test namedtestAlpha
can only succeed after a test namedtestBeta
has run, you can overridetestNames
so that it returns aSet
whose iterator returnstestBeta
beforetestAlpha
. (This trait's implementation ofrun
will invoke tests in the order they come out of thetestNames
Set
iterator.)Alternatively, you may not like starting your test methods with
test
, and prefer using@Test
annotations in the style of Java's JUnit 4 or TestNG. If so, you can overridetestNames
to discover tests using either of these two APIs@Test
annotations, or one of your own invention. (This is in fact howorg.scalatest.junit.JUnitSuite
andorg.scalatest.testng.TestNGSuite
work.)Moreover, test in ScalaTest does not necessarily mean test method. A test can be anything that can be given a name, that starts and either succeeds or fails, and can be ignored. In
org.scalatest.FunSuite
, for example, tests are represented as function values. This approach might look foreign to JUnit users, but may feel more natural to programmers with a functional programming background. To facilitate this style of writing tests,FunSuite
overridestestNames
,runTest
, andrun
such that you can define tests as function values.You can also model existing JUnit 3, JUnit 4, or TestNG tests as suites of tests, thereby incorporating tests written in Java into a ScalaTest suite. The "wrapper" classes in packages
org.scalatest.junit
andorg.scalatest.testng
exist to make this easy. No matter what legacy tests you may have, it is likely you can create or use an existingSuite
subclass that allows you to model those tests as ScalaTest suites and tests and incorporate them into a ScalaTest suite. You can then write new tests in Scala and continue supporting older tests in Java.