我一直在关注使用官方 Play 文档中的 Specs2 的 Scala 测试示例。我注意到他们使用 WithApplication启动一个伪造的应用程序进行测试,使用如下所示的 clode:

"something" should { 
    "do X" in new WithApplication { /* ... */ } 
    "do Y" in new WithApplication { /* ... */ } 
    "do Z" in new WithApplication { /* ... */ } 
} 

这很好,但我遇到的问题是每次发生这种情况时我都会承担启动应用程序的成本。一旦您的测试套件增长到合理的大小,这不一定是“快”或至少不够快。我试过做这样的事情:
val app = FakeApplication() 
"something" should { 
    "do X" in new WithApplication(app) { /* ... */ } 
    "do Y" in new WithApplication(app) { /* ... */ } 
    "do Z" in new WithApplication(app) { /* ... */ } 
} 


"something" should { 
    val app = FakeApplication() 
    Helpers.running(app) { 
        "do X" in { /* ... */ } 
        "do Y" in { /* ... */ } 
        "do Z" in { /* ... */ } 
    } 
} 

第一个似乎适用于第一个测试,然后在以后的测试中提示数据库连接问题。我猜这里有些东西正在关闭或其他东西(不确定是什么)。

第二个根本不起作用,因为它提示没有正在运行的应用程序,我也不确定。

任何帮助是极大的赞赏。谢谢!

请您参考如下方法:

好吧,这取决于您要测试的内容。如果您只是对没有外部依赖项或可以模拟或 stub 的依赖项的单元测试代码(并且以允许这样做的方式构造代码是一个好主意),那么您不需要使用 WithApplication .这可能是最好的方法。

您提供的第一个解决方案不起作用,因为应用程序只能使用一次。它是 WithApplication启动和停止您的应用程序,因此即使确实有效,您也不会获得任何性能优势。

您提供的第二个解决方案不起作用,因为当 Helpers.running(app) { }代码块运行,这只是声明规范。 Specs 将所有这些都放在一个列表中,然后您退出运行 block 并关闭应用程序。然后在某个时间点,specs 运行测试,然后当然没有应用程序。

所以,如果你不能独立于应用程序的其余部分来测试你的代码,那么你需要有一个正在运行的应用程序,对此你无能为力,这就是集成测试的现实。而且您可能希望它在每次测试之间启动和关闭,否则您的测试不会彼此隔离运行。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!