ScalaTest和Scala Specsunit testing框架有什么区别?
两者都是用Scala编写的Scala的BDD(行为驱动开发)functionunit testing框架。 Specs 的构build也可能涉及到ScalaTest框架。 但Specs提供的ScalaTest不具备什么function? 有什么区别?
规范和ScalaTest都是开心用户的好工具,但它们在几个方面有所不同。 您可能会希望select一个作为您在Scala中的主要testing工具,但不必放弃另一个,因为您可以使用这两者。 例如,如果您喜欢ScalaTest的FeatureSpec
语法和规范的Mockito语法,则可以将两个jar文件放在您的类path中,并同时使用它们。 在这里,我将尝试捕捉我在Specs和ScalaTest之间注意到的主要devise理念差异。
这些工具之间的主要哲学差异可能在于规范是为行为驱动开发(BDD)devise的,而ScalaTest则更为通用。 ScalaTest提供了可以混合在一起的特性,以便在您的testing类(包括BDD)中获得您喜欢的行为,并且如果您需要不同的东西,还可以轻松定义自己的行为。
ScalaTest通过Spec
, FeatureSpec
, WordSpec
, FlatSpec
和GivenWhenThen
特性来支持BDD,并且还可以混合使用特征来获得更好的匹配器语法。 如果你喜欢“应该”,你可以混合在ShouldMatchers中。 如果你喜欢“必须”,你可以混入MustMatchers
。 但是如果你喜欢BDD但不喜欢匹配器的语法,你可以使用ScalaTest的Spec特性之一,而不用混合匹配器的特性。 规范有一个扩展的规范类,你必须在你的匹配expression式中使用单词“必须”。 一个很大的哲学差异在这里是明显的ScalaTest给你更多的select。 为了使这个select的空间更容易导航,我在这里提供一个决策树:
http://www.scalatest.org/quick_start
ScalaTest和specs之间的匹配器语法也不同。 在ScalaTest中,我试图用运算符来看看能走多远,最后用matcherexpression式来读取非常像英语句子,并在单词之间留有空格。 规格匹配器语法更多地与骆驼案例一起运行。
规范有比ScalaTest更匹配,我认为反映了devise态度的差异。 我实际上已经削减了我构build的匹配器语法的2/3,并考虑发布。 我将在未来版本中添加更多的匹配器,但是我想知道用户在添加之前真正需要的东西。 但是ScalaTest的匹配器包含一个dynamic属性匹配器语法,它占用了一些这样的冗余。 例如在Specs中你可以写在java.io.File
:
file must beDirectory
这将调用isDirectory
并确保它是真实的。 ScalaTest目前没有针对java.io.Files
特殊匹配器,但是在ScalaTest中,可以使用如下的dynamic检查:
file must be a ('directory)
任何时候你传入一个符号后,它都会使用reflection来查找(在这种情况下)一个名为directory
的方法或字段或一个名为isDirectory
。 还有一种方法可以通过定义一个BePropertyMatcher
(通常只需要2或3行代码)来实现静态化。 所以基本上在ScalaTest中,我尝试用更less的API来提供更多的function。
规范和ScalaTest之间的另一个一般devise态度差异涉及隐式转换。 默认情况下,当您使用ScalaTest时,只会得到一个隐式转换,ScalaTest会将===
运算符放在一切上。 (如果你需要的话,你可以用一行代码“closures”这个隐式转换,你需要这样做的唯一原因是如果你试图testing一些有自己的===
运算符的东西, ScalaTest定义了许多其他的隐式转换,但要使用它们,您需要通过混合特性或进行导入来明确“邀请”它们到您的代码中。 当你在规范中扩展class Specification
,我想你几乎默认会得到几十个隐式转换。 我不确定这在实践中有多重要,但是我认为人们会想要testing使用自己的含义的代码,有时testing框架的含义和生产代码之间可能会有冲突。 当发生这种情况时,我认为在ScalaTest中解决问题可能比规范更容易。
我注意到devise态度的另一个不同是操作员的舒适感。 我的一个目标是,任何使用ScalaTest的程序员都可以猜测出他人的testing代码,而不需要在ScalaTest文档中查找任何内容。 我希望ScalaTest客户端代码明显地下降。 目标所performance出来的一个方法是ScalaTest对运营商非常保守。 我只在ScalaTest中定义了五个运算符:
-
===
,这意味着等于 -
>
,这意味着大于 -
<
,小于 -
>=
,大于或等于 -
<=
,小于或等于。
而已。 所以这些东西看起来像是什么意思。 如果你看到别人的代码:
result should be <= 7
我的希望是,你将不需要运行API文档来猜测<=
意味着什么。 相比之下,运营商的规格更为自由。 没有什么不对,但这是一个区别。 运算符可以使代码更加简洁,但是当您发现像->-
, >>
, |
时,您可能必须运行到文档|
, |>
!
,或^^^
(在规格中都有特殊的含义)在您的同事的testing代码。
另外一个哲学上的区别是,当你需要共享一个fixture时,我试着在ScalaTest中稍微简单地使用一个函数式样,而Specs默认inheritance了JUnit推广的setUp
和tearDown
方法的传统,每次testing前重新分配variables。 但是如果你想以这种方式进行testing,那么在ScalaTest中也很容易。 你只需要混合BeforeAndAfter
特质。
为了更深入地了解ScalaTest,您可以在这里参加2009年Devoxx会议上的“获得更高级的ScalaTest”演示文稿:
http://parleys.com/play/514892260364bc17fc56bde3/chapter0/about
主要的区别是(主要是从规格的angular度来看:-)):
-
ScalaTest比规范提供了更多的“testing样式”(您可以访问快速入门页面上的每个项目符号点以获取每种样式的详细视图)
-
ScalaTest和specs有一套不同的匹配器。 你可以在这里比较它们的ScalaTest和这里的规格。 在这方面,specs有很多小的特性,你可能会喜欢的时候编写你的规范:xml matchers,matchers组合(一种简单的方式来重用matcher,通过转换它们),精确的失败,长string的详细区别。 。
-
Mockito已经在specs中得到了很好的BDD支持: Mockito
-
规范有DataTables ,它允许在一个表中分组很多小例子(如果你可以站在操作符被用作表分隔符)
-
在规范中,您可以定义嵌套为libidum的示例,并在每个级别自动进行清理
这当然是一个非常偏颇的和有偏见的比较,还有很多其他的不同之处(而且图书馆还在不断发展中……)。
在一天结束时,我认为这取决于你的testing/指定风格。 如果它很简单(简单的规范结构,设置,期望…),那么这两个库将显得非常相似。 否则,双方都应该如何处理。 作为最后一个例子,你可以看看标签:在ScalaTest和规格 。
我希望这有帮助。
据我所知,除了一些高度专业化的function,根据风格归结为个人喜好。
IDE支持可能是另一点
我一直在试图让Specs通过JUnit与Eclipse一起工作,我发现官方的解决scheme有点“哈克”。 规格设置: http : //code.google.com/p/specs/wiki/RunningSpecs#Run_your_specification_with_JUnit4_in_Eclipse
ScalaTest的整合(也通过JUnit)似乎有点不太好。 尽pipe如此,我还没有像JUnit和Java那样工作。
ScalaTest设置: http : //groups.google.com/group/scalatest-users/web/running-scalatest-from-eclipse
如果一个决定因素是编译时间, scalatest似乎performance更好。
我们目前在我们的项目中使用specs2,但在testing中遇到编译时间慢的问题。 我刚刚完成了一个POC,转向Scalatest,只是通过切换一些源代码中的2个框架,我发现编译时间下降了大约0.82倍。
ScalaTest和Specs2的主要区别是:
- Specs2中的testing的整体结构与ScalaTest中的不同。
- Specs2具有不同语法的Matcher集合。
- Specs2testing主要致力于行为驱动开发(BDD) ,而ScalaTesttesting更为通用。
- ScalaTest提供了更多的select和多function性。 例如,要在ScalaTest中编写类似于BDD的Specs2,可以使用Spec , FeatureSpec , WordSpec , FlatSpec和GivenWhenThen特性以及ShouldMatchers或MustMatcher 。 这使得开发人员可以更灵活地遵循他/她自己的编写规范。
-
Specs2具有比ScalaTest更多的Matcher。 他们大多数是为了一个特殊的需要。 例如,在Specs2中,你可以说:
aFile必须是aDirectory
-
Specs2有java.io.Files的单个匹配器,ScalaTest没有类似的匹配器。
-
ScalaTest和Spec之间的另一个区别是隐式转换。 ScalaTest只有一个隐式转换,我们使用===运算符来实现。 但是,这可以在ScalaTest中使用一行代码closures。 这是在ScalaTest中免费获得的唯一隐式转换。 还有其他隐式转换,可以通过混入其他特性来使用。 与此Specs2相反,只需扩展Specification类即可实现数十种隐式转换。 实际上,这并没有太大区别。 唯一的区别是testing代码在没有显式转换的情况下会更具可读性。
-
Specs2有数据表。 这允许使用很多可以驱动testing的例子,就像属性驱动的testing一样。
-
Specs2testing与ScalaTest不同,因为它们可以在单独的线程中同时执行。