如何确保在 scalatest 中的所有测试之后执行测试?
How to ensure that test is executed after all tests in scalatest?
我想测试 REST API 的所有方法是否都被测试覆盖。
所有 http 调用都记录到一个可变集中,我有一段代码检查规范和记录 api 调用的结果集之间的对应关系。
我可以将此检查放在 FunSuite 末尾的单独 test
中,它将在所有其他测试之后执行。但是,有两个问题:我必须将它复制粘贴到每个测试文件中 API 并确保它在文件末尾。
使用共同特征不起作用:来自父 class 的测试在来自子 class 的测试之前执行。将测试放在 afterAll
中也不起作用:scalatest
吞没了其中抛出的所有异常(包括测试失败)。
有没有办法在没有样板的情况下运行进行一些测试?
就我个人而言,我会使用专用的覆盖工具,例如 scoverage。一个优点是避免全局状态。
尽管如此,根据问题,在所有测试之后执行测试的方法是通过 Suites
和 BeforeAndAfterAll
这样的特征
import org.scalatest.{BeforeAndAfterAll, Suites, Matchers}
class AllSuites extends Suites(
new FooSpec,
new BarSpec,
) with BeforeAndAfterAll withy Matchers {
override def afterAll(): Unit = {
// matchers here as usual
}
}
这是一个玩具示例,其中包含每个问题的全局状态
AllSuites.scala
import org.scalatest.{BeforeAndAfterAll, Matchers, Suites}
object GlobalMutableState {
val set = scala.collection.mutable.Set[Int]()
}
class AllSuites extends Suites(
new HelloSpec,
new GoodbyeSpec
) with BeforeAndAfterAll with Matchers {
override def afterAll(): Unit = {
GlobalMutableState.set should contain theSameElementsAs Set(3,2)
}
}
HelloSpec.scala
@DoNotDiscover
class HelloSpec extends FlatSpec with Matchers {
"The Hello object" should "say hello" in {
GlobalMutableState.set.add(1)
"hello" shouldEqual "hello"
}
}
GoodbyeSpec.scala
@DoNotDiscover
class GoodbyeSpec extends FlatSpec with Matchers {
"The Goodbye object" should "say goodbye" in {
GlobalMutableState.set.add(2)
"goodbye" shouldEqual "goodbye"
}
}
现在执行 sbt test
会得到类似
的结果
[info] example.AllSuites *** ABORTED ***
[info] HashSet(1, 2) did not contain the same elements as Set(3, 2) (AllSuites.scala:15)
[info] HelloSpec:
[info] The Hello object
[info] - should say hello
[info] GoodbyeSpec:
[info] The Goodbye object
[info] - should say goodbye
[info] Run completed in 377 milliseconds.
[info] Total number of tests run: 2
[info] Suites: completed 2, aborted 1
[info] Tests: succeeded 2, failed 0, canceled 0, ignored 0, pending 0
[info] *** 1 SUITE ABORTED ***
[error] Error during tests:
[error] example.AllSuites
[error] (Test / test) sbt.TestsFailedException: Tests unsuccessful
我想测试 REST API 的所有方法是否都被测试覆盖。 所有 http 调用都记录到一个可变集中,我有一段代码检查规范和记录 api 调用的结果集之间的对应关系。
我可以将此检查放在 FunSuite 末尾的单独 test
中,它将在所有其他测试之后执行。但是,有两个问题:我必须将它复制粘贴到每个测试文件中 API 并确保它在文件末尾。
使用共同特征不起作用:来自父 class 的测试在来自子 class 的测试之前执行。将测试放在 afterAll
中也不起作用:scalatest
吞没了其中抛出的所有异常(包括测试失败)。
有没有办法在没有样板的情况下运行进行一些测试?
就我个人而言,我会使用专用的覆盖工具,例如 scoverage。一个优点是避免全局状态。
尽管如此,根据问题,在所有测试之后执行测试的方法是通过 Suites
和 BeforeAndAfterAll
这样的特征
import org.scalatest.{BeforeAndAfterAll, Suites, Matchers}
class AllSuites extends Suites(
new FooSpec,
new BarSpec,
) with BeforeAndAfterAll withy Matchers {
override def afterAll(): Unit = {
// matchers here as usual
}
}
这是一个玩具示例,其中包含每个问题的全局状态
AllSuites.scala
import org.scalatest.{BeforeAndAfterAll, Matchers, Suites}
object GlobalMutableState {
val set = scala.collection.mutable.Set[Int]()
}
class AllSuites extends Suites(
new HelloSpec,
new GoodbyeSpec
) with BeforeAndAfterAll with Matchers {
override def afterAll(): Unit = {
GlobalMutableState.set should contain theSameElementsAs Set(3,2)
}
}
HelloSpec.scala
@DoNotDiscover
class HelloSpec extends FlatSpec with Matchers {
"The Hello object" should "say hello" in {
GlobalMutableState.set.add(1)
"hello" shouldEqual "hello"
}
}
GoodbyeSpec.scala
@DoNotDiscover
class GoodbyeSpec extends FlatSpec with Matchers {
"The Goodbye object" should "say goodbye" in {
GlobalMutableState.set.add(2)
"goodbye" shouldEqual "goodbye"
}
}
现在执行 sbt test
会得到类似
[info] example.AllSuites *** ABORTED ***
[info] HashSet(1, 2) did not contain the same elements as Set(3, 2) (AllSuites.scala:15)
[info] HelloSpec:
[info] The Hello object
[info] - should say hello
[info] GoodbyeSpec:
[info] The Goodbye object
[info] - should say goodbye
[info] Run completed in 377 milliseconds.
[info] Total number of tests run: 2
[info] Suites: completed 2, aborted 1
[info] Tests: succeeded 2, failed 0, canceled 0, ignored 0, pending 0
[info] *** 1 SUITE ABORTED ***
[error] Error during tests:
[error] example.AllSuites
[error] (Test / test) sbt.TestsFailedException: Tests unsuccessful