首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在所有Scalatest测试之前或之后做一些事情

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

Stack Overflow用户
提问于 2013-03-15 09:45:10
回答 3查看 34.7K关注 0票数 73

我有一套最具伸缩性的测试,用于测试RESTful应用程序接口的不同端点。我真的希望将它们分开到不同的文件中,以便更好地组织。

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

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

--在测试前启动http服务器

--运行所有测试套件

--关闭http服务器

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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忽略它们。

票数 57
EN

Stack Overflow用户

发布于 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
        }   
}

好的,但是测试怎么办呢?请注意带有BarFoo。我将依赖测试作为特征引入。请看这里:

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!") {  }
    }
}
票数 11
EN

Stack Overflow用户

发布于 2014-06-02 00:31:26

或者,您可以只使用一个对象。

object TestServer {
  startServer()
}

当你访问这个对象时,它将被初始化,启动服务器。只需在访问对象的主体中创建一个公共特征即可。然后在你的所有测试中加入这一特性。好了。

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15423337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档