为什么使用 Specs2 而不是 JUnit



我们浏览了在线材料,例如scalatest site。使用 scala 测试框架 Specs2 有哪些优势?它如何通过 JUnit 添加到项目中?

我有点不愿意回答这个问题,因为这是一件非常主观的事情。

但我可以把它总结为"就像Scala给你新的、更干净的方法来解决Java问题一样,Specs2给你新的、更干净的方法来测试JUnit"。

一些简单的例子:

莫基托是一等公民

Mockito是我最喜欢的JVM模拟库;与Specs2一起使用就像混合一个特征一样简单,你会得到一个很好的DSL进行验证:

class MySpec extends Specification with Mockito { 
   // Setup:
   val mockConnection = mock[Connection]
   ...
   // Verification: (in a test)
   there was one(mockConnection).get("www.google.com")
}  

ScalaCheck 是一等公民

ScalaCheck 可以节省大量时间"模糊测试"函数的输入,同样,一个简单的特征混合可以在您的 Specs2 测试中为您提供所有功能。

Scope中运行测试

曾经遇到过测试可以在您的机器上运行但在其他地方中断的问题,因为您的机器按特定顺序运行它们?还是由于存根合作者行为之间的相互作用而陷入"嘲笑地狱"?Specs2 允许您将整个测试放入 Scope 中,以包含所有该状态并阻止其泄漏到其他测试中:

class AnotherSpec extends Specification with Mockito {
  class FooScope extends Scope {
    val mockResponse = mock[Response]
    val mockConnection = mock[Connection]
    ...
    mockConnection.execute returns mockResponse
    def frobulate(s:String) = {
      // Use mockResponse, mockConnection, etc ...
    }
  }
"My thing" should {
  "Do stuff" in new FooScope {
    frobulate("hello")
    there was one(mockConnection).post(...)
  }
}

Scope可以帮助您干涸测试并阻止它们之间的状态泄漏。

  • "块"对相关测试进行分组("My thing" should(
  • 可读、以空格分隔的测试名称 ( "throw an exception if argument < 0" in (
  • 用于匹配的可读DSL ( result must have length(7) (
  • 斯卡拉惯用型的匹配器 ( result must beNone (
  • 使用pending轻松暂时禁用测试
  • 使用 DSL 生成 HTML 报告/输出

缺点

为了使这个答案稍微客观一些,我还应该指出受人尊敬的Bill Venners关于编译时间的文章,该文章指出,由于大量的隐式和函数声明,Specs2 mutable.Specification的编译速度几乎比大致等效的JUnit测试慢一个数量级。它也不能很好地扩展到大量测试中。或者至少在2013年初写这篇文章时没有。现在可以使用一些方法来解决此问题。

相关内容

  • 没有找到相关文章

最新更新