12.4 使用Runner

ScalaTest提供的Runner类③可以用来执行多个测试套件。你可以指定Runner运行哪些套件,不运行哪些套件,还可以附加不同的reporter,用以显示测试结果。ScalaTest的文档中描述了Runner的所有选项(参见附录A)。

③ScalaTest还提供了一个SuperSuite,我们可以从它继承,也可以嵌套其他套件。不过Runner会自动发现测试套件,无需编码。

看一下使用Runner的例子。假设我们有一个测试套件,叫做ListTest

UnitTestingWithScala/ListTest.scala

  1. class ListTest extends org.scalatest.Suite {
  2. def testListEmpty() {
  3. val list = new java.util.ArrayList[Integer]
  4. assert(0 == list.size)
  5. }
  6. def testListAdd() {
  7. val list = new java.util.ArrayList[Integer]
  8. list.add(1)
  9. list add 4
  10. assert(2 == list.size)
  11. }
  12. }

12.4 使用Runner - 图1

图12-1 用Runner执行ScalaTest

我们可以用如下命令进行编译再运行:

  1. scalac -classpath $SCALATEST ListTest.scala
  2. scala -classpath $SCALATEST:. org.scalatest.tools.Runner -p .

-p选项指定了Runner到哪个目录下查找测试套件。因为我们没有指定某个具体的测试套件,所以它就会把给定路径下所有编译后的测试套件全都装载进来。上述代码的输出如图12-1所示。如果没看到每个测试的详细信息,可以试一下“View”菜单里面的菜单项。

如果你对命令行情有独钟(就像鄙人一样),还可以用-o选项把测试执行结果定向到标准输出,而不是用GUI显示。下面是要用到的命令:

  1. scalac -classpath $SCALATEST ListTest.scala
  2. scala -classpath $SCALATEST:. org.scalatest.tools.Runner -p . -o

输出如下:

  1. Run starting. Expected test count is: 2
  2. Suite Starting - DiscoverySuite: The execute method of a nested suite is
  3. about to be invoked.
  4. Suite Starting - ListTest: The execute method of a nested suite is about
  5. to be invoked.
  6. Test Starting - ListTest.testListAdd
  7. Test Succeeded - ListTest.testListAdd
  8. Test Starting - ListTest.testListEmpty
  9. Test Succeeded - ListTest.testListEmpty
  10. Suite Completed - ListTest: The execute method of a nested suite returned
  11. normally.
  12. Suite Completed - DiscoverySuite: The execute method of a nested suite
  13. returned normally.
  14. Run completed. Total number of tests run was: 2
  15. All tests passed.

另外,-f选项还可以把结果重定向到文件。如果需要记录结果,在持续集成中进行处理,这个选项就相当有用④。

④参见附录A中的“持续集成”,并请参阅Mike Clark所著的《项目自动化之道》和Duvall所著的《持续集成》。