我有一套最具伸缩性的测试,用于测试RESTful应用程序接口的不同端点。我真的希望将它们分开到不同的文件中,以便更好地组织。
我的问题是如何在所有测试之前启动某个东西(在我的例子中是HTTP服务器,但它是什么并不重要),并在所有测试完成后将其关闭。
我知道BeforeAndAfterAll,但这只能在一个测试文件中完成之前/之后。我需要这样的东西,但对于所有测试,例如:
--在测试前启动http服务器
--运行所有测试套件
--关闭http服务器
发布于 2013-03-22 03:27:20
这样做的目的是使用嵌套套件。Suite有一个返回IndexedSeqSuite的nestedSuites方法。Suite还有一个runNestedSuites方法,负责执行任何嵌套的Suite。默认情况下,runNestedSuites调用nestedSuites,并在每个返回的套件上直接调用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
}
}
然而,一个潜在的问题是,如果您使用discovery来查找要运行的套件,那么EndpointTests、Foo和Bar的所有三个都将被发现。在ScalaTest2.0中,你可以用@DoNotDiscover注解Foo和ScalaTest,ScalaTest不会发现它们。但sbt仍然会这样做。我们目前正在增强sbt,这样它就可以跳过使用DoNotDiscover注释的其他可发现的套件,但这将在sbt0.13中完成,该版本还没有发布。同时,您可以通过向Foo和Bar添加一个未使用的构造函数参数来让sbt忽略它们。
发布于 2013-03-15 10:31:12
好吧,我找到了一个方法。似乎(除非这里有人能纠正我) 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
}
}
好的,但是测试怎么办呢?请注意带有Bar
的Foo
。我将依赖测试作为特征引入。请看这里:
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!") { }
}
}
发布于 2014-06-02 00:31:26
或者,您可以只使用一个对象。
object TestServer {
startServer()
}
当你访问这个对象时,它将被初始化,启动服务器。只需在访问对象的主体中创建一个公共特征即可。然后在你的所有测试中加入这一特性。好了。
如果您的服务器在守护程序模式下运行(例如,播放!应用程序处于测试模式),它将在所有测试运行后自动关闭。
https://stackoverflow.com/questions/15423337
复制相似问题