12.4 使用Runner
ScalaTest提供的Runner
类③可以用来执行多个测试套件。你可以指定Runner
运行哪些套件,不运行哪些套件,还可以附加不同的reporter
,用以显示测试结果。ScalaTest的文档中描述了Runner
的所有选项(参见附录A)。
③ScalaTest还提供了一个
SuperSuite
,我们可以从它继承,也可以嵌套其他套件。不过Runner
会自动发现测试套件,无需编码。
看一下使用Runner
的例子。假设我们有一个测试套件,叫做ListTest
:
UnitTestingWithScala/ListTest.scala
class ListTest extends org.scalatest.Suite {
def testListEmpty() {
val list = new java.util.ArrayList[Integer]
assert(0 == list.size)
}
def testListAdd() {
val list = new java.util.ArrayList[Integer]
list.add(1)
list add 4
assert(2 == list.size)
}
}
图12-1 用Runner
执行ScalaTest
我们可以用如下命令进行编译再运行:
scalac -classpath $SCALATEST ListTest.scala
scala -classpath $SCALATEST:. org.scalatest.tools.Runner -p .
-p
选项指定了Runner
到哪个目录下查找测试套件。因为我们没有指定某个具体的测试套件,所以它就会把给定路径下所有编译后的测试套件全都装载进来。上述代码的输出如图12-1所示。如果没看到每个测试的详细信息,可以试一下“View”菜单里面的菜单项。
如果你对命令行情有独钟(就像鄙人一样),还可以用-o
选项把测试执行结果定向到标准输出,而不是用GUI显示。下面是要用到的命令:
scalac -classpath $SCALATEST ListTest.scala
scala -classpath $SCALATEST:. org.scalatest.tools.Runner -p . -o
输出如下:
Run starting. Expected test count is: 2
Suite Starting - DiscoverySuite: The execute method of a nested suite is
about to be invoked.
Suite Starting - ListTest: The execute method of a nested suite is about
to be invoked.
Test Starting - ListTest.testListAdd
Test Succeeded - ListTest.testListAdd
Test Starting - ListTest.testListEmpty
Test Succeeded - ListTest.testListEmpty
Suite Completed - ListTest: The execute method of a nested suite returned
normally.
Suite Completed - DiscoverySuite: The execute method of a nested suite
returned normally.
Run completed. Total number of tests run was: 2
All tests passed.
另外,-f
选项还可以把结果重定向到文件。如果需要记录结果,在持续集成中进行处理,这个选项就相当有用④。
④参见附录A中的“持续集成”,并请参阅Mike Clark所著的《项目自动化之道》和Duvall所著的《持续集成》。