2011-12-13 137 views
9

我有一个使用org.scalatest进行测试的scala应用程序。这些测试需要一些全局设置(和拆卸),以便管理测试数据库。org.scalatest:全局设置(像beforeAllSuites?)

请不要告诉我我的测试不应该打到数据库,我应该这样做Java-DAO-Stub-WTF-Overkill-Way™:-)。

我正在使用SBT,它提供了一种试验前后执行代码测试:

testOptions in Test += Tests.Setup(() => println("Setup")) 

    testOptions in Test += Tests.Cleanup(() => println("Cleanup")) 

可惜我不能在问题进入班那里。毫不奇怪,将它们导入build.sbt也不起作用。

任何想法?

+0

我有一个非常相似的目标,并找到了一个解决方案。检查这个问题:http://stackoverflow.com/questions/27272811/how-to-cut-a-long-scalatest-spec-to-pieces/27275814想要保持初始化步骤作为测试类。 – akauppi

回答

4

根据您的需要,您可以使用BeforeAndAfterAllBeforeAndAfter特征。

BeforeAndAfterAll:

特质,可以混合到需要 前和执行该套件后调用的方法套房。该特征允许代码在套件的所有测试和嵌套套件运行之前和/或之后执行 。

所以在这个例子中,你需要定义一个包含所有其他套件/测试的MasterSuite,它扩展了这个特性。

BeforeAndAfter:

性状可以混合成需要的代码运行的每个测试之前和之后执行 套件。这个特性促进了 中的测试样式,其中实例变量中保存的可变夹具对象被替换为 或在每个测试或套件之前重新初始化。

+3

定义一个MasterSuite意味着我的所有测试都需要在一个文件中定义,对吧? 现在,我已将所有依赖于数据库的测试分为一个套件并在那里使用BeforeAndAfterAll。这也有我可以轻松跳过这些慢速测试的优势。 –

+3

多年后,但仍然与任何人发现问题相关:您不需要在单个文件中定义所有测试,ScalaTest具有组合功能,您可以使用'class MasterSuite extends Suites(new OneSpec,new TwoSpec)',所以组合套件只需要放在类路径中('BeforeAndAfterAll' Scaladoc就是一个例子,所以很容易调用)。由于2.0 ScalaTest具有'@ DoNotDiscover'注释,因此您可以停止运行所有组合套件的SBT(或任何支持的运行程序),而只能运行主设备。 – ches

+0

其实作者在这里涵盖了它:http://stackoverflow.com/questions/15423337/doing-something-before-or-after-all-scalatest-tests – ches