- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
两者都是用 Scala 编写的具有 BDD(行为驱动开发)功能的 Scala 单元测试框架。和 Specs建立在可能还涉及ScalaTest框架。但是 Specs 提供了什么 ScalaTest 没有提供?有什么区别?
最佳答案
Specs 和 ScalaTest 都是用户满意的好工具,但它们在几个方面有所不同。您可能希望选择一个作为 Scala 中的主要测试工具,但不必放弃另一个,因为您可以同时使用两者。如果您喜欢 ScalaTest 的 FeatureSpec
语法和规范的 Mockito 语法,例如,您可以将两个 jar 文件放在类路径中并同时使用它们。在这里,我将尝试捕捉我注意到的规范和 ScalaTest 之间的主要设计理念差异。
这些工具之间的主要哲学差异可能是规范是为行为驱动开发 (BDD) 设计的,而 ScalaTest 更通用。 ScalaTest 提供了可以混合在一起的特征,以获得您在测试类中喜欢的行为,包括 BDD,如果您想要不同的东西,您也可以轻松定义自己的行为。
ScalaTest 通过其 Spec
支持 BDD , FeatureSpec
, WordSpec
, FlatSpec
, 和 GivenWhenThen
特征,并且还有一些特征,您可以混合使用以获得不错的匹配器语法。如果您喜欢“应该”,您可以混合使用 ShouldMatchers。如果你喜欢“必须”,你就混入MustMatchers
.但是,如果您喜欢 BDD 但不喜欢 matcher 语法,则可以只使用 ScalaTest 的 Spec 特征之一,而无需混入 matchers 特征。 Specs 有一个可扩展的 Specification 类,并且必须在匹配器表达式中使用“必须”一词。这里很明显的一个很大的哲学差异是 ScalaTest 为您提供了更多的选择。为了使这个选择空间更容易导航,我在这里提供了一个决策树:
http://www.scalatest.org/quick_start
ScalaTest 和规范之间的匹配器语法也不同。在 ScalaTest 中,我试图看看我可以用运算符表示法走多远,最终得到了读起来非常像英语句子的匹配器表达式,单词之间有空格。规范匹配器语法使用驼峰式大小写更多地运行单词。
Specs 比 ScalaTest 有更多的匹配器,我认为这反射(reflect)了设计态度的不同。我实际上削减了我构建并考虑发布的匹配器语法的 2/3。我将在以后的版本中添加更多匹配器,但我想确保在添加之前我知道用户确实想要一些东西。然而 ScalaTest 的匹配器包括一个动态属性匹配器语法,占据了一些松懈。例如,在规范中,您可以写在 java.io.File
上:
file must beDirectory
isDirectory
并确保它是真的。 ScalaTest 没有任何特殊的匹配器
java.io.Files
目前,但在 ScalaTest 中,您可以只使用这样的动态检查:
file must be a ('directory)
be
之后传递一个符号,它将使用反射来查找(在本例中)名为
directory
的方法或字段。或名为
isDirectory
的方法.还有一种方法可以使这个静态,通过定义一个
BePropertyMatcher
(通常只需要 2 或 3 行代码)。所以基本上在 ScalaTest 中,我尝试用更少的 API 提供更多的功能。
===
的一种。运营商的一切。 (如果需要,您可以用一行代码“关闭”这种隐式转换。您需要这样做的唯一原因是,如果您试图测试具有自己的
===
运算符的东西,并且您得到一个冲突。)ScalaTest 定义了许多其他隐式转换,但是要使用它们,您需要通过混合特征或执行导入来显式“邀请”它们到您的代码中。当您扩展类时
Specification
在规范中,我认为默认情况下您几乎会获得数十个隐式转换。我不确定这在实践中有多重要,但我认为人们会想要测试使用他们自己的隐式的代码,有时测试框架的隐式和生产代码的隐式之间可能存在冲突。当这种情况发生时,我认为在 ScalaTest 中解决问题可能比在规范中更容易解决。
===
,这意味着等于 >
,这意味着大于 <
,小于 >=
, 大于或等于 <=
,小于或等于。 result should be <= 7
<=
意味着。相比之下,运营商的规范要自由得多。这没什么错,但这是不同的。操作符可以使代码更简洁,但代价是当你发现诸如
->-
之类的东西时,你可能必须运行到文档中。 ,
>>
,
|
,
|>
,
!
, 或
^^^
(在 Specs 中都有特殊含义)在您同事的测试代码中。
setUp
的传统。和
tearDown
由 JUnit 推广的方法,在这种方法中,您在每次测试之前重新分配变量。但是,如果您想以这种方式进行测试,在 ScalaTest 中也很容易。你只需要混入
BeforeAndAfter
特质。
关于unit-testing - ScalaTest 和 Scala Specs 单元测试框架有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2220815/
我有一些 Scala 代码,它用两个不同版本的类型参数化函数做了一些漂亮的事情。我已经从我的应用程序中简化了很多,但最后我的代码充满了形式 w(f[Int],f[Double]) 的调用。哪里w()是
如果我在同一目录中有两个单独的未编译的 scala 文件: // hello.scala object hello { def world() = println("hello world") }
val schema = df.schema val x = df.flatMap(r => (0 until schema.length).map { idx => ((idx, r.g
环境: Play 2.3.0/Scala 2.11.1/IntelliJ 13.1 我使用 Typesafe Activator 1.2.1 用 Scala 2.11.1 创建一个新项目。项目创建好后
我只是想知道如何使用我自己的类扩展 Scala 控制台和“脚本”运行程序,以便我可以通过使用实际的 Scala 语言与其通信来实际使用我的代码?我应将 jar 放在哪里,以便无需临时配置即可从每个 S
我已经根据 README.md 文件安装了 ensime,但是,我在低级 ensime-server 缓冲区中出现以下错误: 信息: fatal error :scala.tools.nsc.Miss
我正在阅读《Scala 编程》一书。在书中,它说“一个函数文字被编译成一个类,当在运行时实例化时它是一个函数值”。并且它提到“函数值是对象,因此您可以根据需要将它们存储在变量中”。 所以我尝试检查函数
我有 hello world scala native 应用程序,想对此应用程序运行小型 scala 测试我使用通常的测试命令,但它抛出异常: NativeMain.scala object Nati
有few resources在网络上,在编写与代码模式匹配的 Scala 编译器插件方面很有指导意义,但这些对生成代码(构建符号树)没有帮助。我应该从哪里开始弄清楚如何做到这一点? (如果有比手动构建
我是 Scala 的新手。但是,我用 创建了一个中等大小的程序。斯卡拉 2.9.0 .现在我想使用一个仅适用于 的开源库斯卡拉 2.7.7 . 是吗可能 在我的 Scala 2.9.0 程序中使用这个
有没有办法在 Scala 2.11 中使用 scala-pickling? 我在 sonatype 存储库中尝试了唯一的 scala-pickling_2.11 工件,但它似乎不起作用。我收到消息:
这与命令行编译器选项无关。如何以编程方式获取代码内的 Scala 版本? 或者,Eclipse Scala 插件 v2 在哪里存储 scalac 的路径? 最佳答案 这无需访问 scala-compi
我正在阅读《Scala 编程》一书,并在第 6 章中的类 Rational 实现中遇到了一些问题。 这是我的 Rational 类的初始版本(基于本书) class Rational(numerato
我是 Scala 新手,我正在尝试开发一个使用自定义库的小项目。我在库内创建了一个mysql连接池。这是我的库的build.sbt organization := "com.learn" name :
我正在尝试运行一些 Scala 代码,只是暂时打印出“Hello”,但我希望在 SBT 项目中编译 Scala 代码之前运行 Scala 代码。我发现在 build.sbt 中有以下工作。 compi
Here链接到 maven Scala 插件使用。但没有提到它使用的究竟是什么 Scala 版本。我创建了具有以下配置的 Maven Scala 项目: org.scala-tools
我对 Scala 还很陌生,请多多包涵。我有一堆包裹在一个大数组中的 future 。 future 已经完成了查看几 TB 数据的辛勤工作,在我的应用程序结束时,我想总结上述 future 的所有结
我有一个 scala 宏,它依赖于通过包含其位置的静态字符串指定的任意 xml 文件。 def myMacro(path: String) = macro myMacroImpl def myMacr
这是我的功能: def sumOfSquaresOfOdd(in: Seq[Int]): Int = { in.filter(_%2==1).map(_*_).reduce(_+_) } 为什么我
这个问题在这里已经有了答案: Calculating the difference between two Java date instances (45 个答案) 关闭 5 年前。 所以我有一个这
我是一名优秀的程序员,十分优秀!