我们浏览了 scalatest 网站等在线资料。使用 scala 测试框架 Specs2 有什么优势?它如何通过 JUnit 添加到项目中?
1 回答
我有点不愿意回答这个问题,因为这是一件非常主观的事情。
但我可以将其总结为“就像 Scala 为您提供了通过 Java 解决问题的新的更简洁的方法一样,Specs2 为您提供了通过 JUnit 进行测试的新的更简洁的方法”。
一些简单的例子:
Mockito是一等公民
Mockito是我最喜欢的 JVM 模拟库;将它与 Specs2 一起使用就像混合一个 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可以为您的函数节省大量“模糊”输入的时间,并且再次,一个简单的 trait mixin可以让您在 Specs2 测试中获得所有功能。
在 a 中运行测试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
s 帮助您完成测试并阻止它们之间的状态泄漏。
加
- “块”对相关测试进行分组 (
"My thing" should
) - 可读的,以空格分隔的测试名称 (
"throw an exception if argument < 0" in
) - 用于匹配的可读 DSL (
result must have length(7)
) - Scala 惯用类型的匹配器 (
result must beNone
) - 轻松地暂时禁用测试
pending
- 使用 DSL生成 HTML 报告/输出
缺点
为了使这个答案更加客观,我还应该指出受人尊敬的 Bill Venners 的这篇关于编译时间的文章,它指出 Specs2mutable.Specification
由于大量的隐式和函数声明,几乎是一个顺序-编译速度比大致等效的 JUnit 测试慢。它在大量测试中也不能很好地扩展。或者至少在 2013 年初写这篇文章时没有。现在有一些方法可以用来解决这个问题。