在所有Scalatest测试之前或之后做一些事情



我有一套最大规模的测试,用于测试RESTful API的不同端点。我真的想把它们分成不同的文件,以便更好地组织。

我的问题是如何在所有测试之前启动某些东西(在我的情况下是HTTP服务器,但它是什么并不重要),并在所有测试完成后关闭它。

我知道关于BeforeAndAfterAll,但这只完成之前/之后在一个测试文件内。我需要这样的东西,但是对于所有的测试,例如:

——在测试前启动HTTP服务器
——运行所有测试套件
——关闭HTTP服务器

预期的方法是使用嵌套套件。Suite有一个nestedSuites方法,它返回一个IndexedSeq[Suite](在2.0中,在1.9.1它是一个List[Suite])。Suite还有一个runNestedSuites方法,负责执行任何嵌套套件。默认情况下,runNestedSuites调用nestedSuites,并且在每个返回的Suite上直接调用run,或者如果传递了分发器,则将嵌套套件放入分发器中,以便它们可以并行运行。

所以你真正可能想要做的是使Foo和Bar成为类,并从EndpointTests的nestedSuites方法返回它们的实例。有一个类可以让这变得简单,叫做Suites。下面是一个使用它的例子:

import org.scalatest._
import matchers.MustMatchers
class Foo extends FunSpec with MustMatchers {
  describe("Message here...") {
    it("Must do something") {  }
    it("Must be ok") {  }
  }
}
class Bar extends FunSpec with MustMatchers {
  describe("Hello you...") {
    it("One more!") {  }
  }
}
class EndpointTests extends Suites(new Foo, new Bar) with BeforeAndAfterAll {
  override def beforeAll(configMap: Map[String, Any]) {
    println("Before!")  // start up your web server or whatever
  }     
  override def afterAll(configMap: Map[String, Any]) {
    println("After!")  // shut down the web server
  }         
}

但是,一个潜在的问题是,如果您使用发现来查找要运行的套件,那么将会发现所有三个EndpointTests、Foo和Bar。在ScalaTest 2.0中,你可以用@DoNotDiscover注释Foo和Bar,而ScalaTest的Runner不会发现它们。但我仍然会。我们目前正在增强sbt,这样它就可以忽略那些用DoNotDiscover注释的可发现套件,但这将在sbt 0.13中实现,目前还没有发布。与此同时,您可以通过向Foo和Bar添加一个未使用的构造函数参数来让sbt忽略它们。

好吧,我找到办法了。似乎(除非有人能纠正我),Scalatest没有"主"套房的设施。但是…你可以自己建一个。

你可以用特性组成一个套件。所以使用我的端点示例:

class EndpointTests extends FunSpec with MustMatchers with BeforeAndAfterAll 
      with Foo with Bar {
        override def beforeAll(configMap: Map[String, Any]) {
            println("Before!")  // start up your web server or whatever
        }
        override def afterAll(configMap: Map[String, Any]) {
            println("After!")  // shut down the web server
        }   
}

好的,但是测试呢?注意FooBar。我把依赖测试作为特质引入。在这里看到的:

trait Foo extends FunSpec with MustMatchers {
    describe("Message here...") {
        it("Must do something") {  }
        it("Must be ok") {  }
    }
}
trait Bar extends FunSpec with MustMatchers { 
    describe("Hello you...") {
        it("One more!") {  }
    }
}

也可以直接使用对象。

object TestServer {
  startServer()
}

当您访问该对象时,它将被初始化,启动服务器。只需在访问对象的主体中创建一个公共trait。然后将该特性混合到所有测试中。做。

如果您的服务器运行在守护模式(例如:Play!应用程序处于测试模式),它将在所有测试运行后自动关闭。

最新更新