【问题标题】:Why use Specs2 over JUnit? [closed]为什么使用 Specs2 而不是 JUnit? [关闭]
【发布时间】:2015-06-03 13:47:29
【问题描述】:

我们浏览了 scalatest 网站等在线资料。使用 scala 测试框架 Specs2 有什么优势?它如何通过 JUnit 添加到项目中?

【问题讨论】:

  • 首先——您将通过thisMethodShouldDoThisAndThan 表示法停止眼睛流血,这在 JUnit 中很常见。

标签: scala junit sbt scalatest spec2


【解决方案1】:

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

但我可以将其总结为 “就像 Scala 为您提供了通过 Java 解决问题的新的更简洁的方法一样,Specs2 为您提供了通过 JUnit 进行测试的新的更简洁的方法”。

一些简单的例子:

Mockito 是一等公民

Mockito 是我最喜欢的 JVM 模拟库;将它与 Specs2 一起使用就像 mixing in a trait 一样简单,并且您会得到一个很好的 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 可以为您的函数节省大量“模糊测试”输入的时间,而且a simple trait mixin 在您的 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(...)
  }
}

Scopes 帮助您完成测试并阻止它们之间的状态泄漏。

加号

  • “块”对相关测试进行分组 ("My thing" should)
  • 可读的、以空格分隔的测试名称 ("throw an exception if argument < 0" in)
  • 用于匹配的可读 DSL (result must have length(7))
  • Scala 惯用类型的匹配器 (result must beNone)
  • 使用pending 轻松temporarily disable 进行测试
  • Generate HTML reports/output 带 DSL

缺点

为了使这个答案更加客观,我还应该指出 this article by the esteemed Bill Venners 关于编译时间,它指出 Specs2 mutable.Specification,由于大量的隐式和函数声明,几乎是一个命令-编译速度比大致等效的 JUnit 测试慢。它在大量测试中也不能很好地扩展。或者至少在 2013 年初写这篇文章时没有。现在有 approaches you can use 来解决这个问题。

【讨论】:

  • 天哪。你在写这个答案时做得很好。我不知道这个缺点,也许是因为我的应用程序做了一些测试。
猜你喜欢
  • 2015-04-26
  • 2011-07-08
  • 2015-12-04
  • 2020-12-04
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多