首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么使用Specs2而不是JUnit?

为什么使用Specs2而不是JUnit?
EN

Stack Overflow用户
提问于 2015-03-30 13:52:12
回答 1查看 717关注 0票数 0

我们浏览了一些在线资料,比如最有规模的网站。使用scala测试框架Specs2的优点是什么?它如何通过JUnit添加到项目中?

EN

回答 1

Stack Overflow用户

发布于 2015-03-31 00:38:50

我有点不愿意回答这个问题,因为这是一个相当主观的问题。

但我可以把它概括为,“就像Scala给您提供了解决问题的新的、更干净的方法一样,Specs2为您提供了在JUnit"上测试的新方法和更干净的方法。

以下是一些简单的例子:

莫基托是一位一流的公民。

莫基托是我最喜欢的JVM模拟库;与Specs2一起使用它和混合在一个特性中一样简单,您可以得到一个很好的DSL来进行验证:

代码语言:javascript
复制
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允许您将整个测试置于包含所有状态的作用域中,并阻止它泄漏到其他测试中:

代码语言:javascript
复制
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))
  • Scala-惯用类型的匹配器(result must beNone)
  • 使用暂时停用轻松地使用pending进行测试
  • 带有DSL的生成HTML报告/输出

不利方面

为了使这个答案更加客观,我还应该指出关于编译时间的这篇文章是由尊敬的比尔·文纳斯撰写的,它指出,由于大量的隐式和函数声明,Specs2 mutable.Specification的编译速度几乎比一个大致相同的JUnit测试慢一个数量级。它也不会比大量的测试规模更大。或者说,至少在2013年初写这篇文章的时候没有。现在有了您可以使用的方法来解决这个问题。

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

https://stackoverflow.com/questions/29348008

复制
相关文章

相似问题

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