用Scala测试

现在,当学习一种新的语言或框架时,我的早期问题之一是:测试呢? 显然我也要求Scala。

如果有什么可抱怨的,我想这又是一个众多的选择。

JUnit的

Scala与Java高度兼容,其中包括流行的测试框架Junit。 您可以像往常一样使用JUnit编写测试,但是用Scala类替换Java类

class ConnectionTest {
    import org.junit.Test
    import org.junit.Assert._
 
    @Test
    def connection_Equals_itself() {
        val con = Connection(Corner(), Corner())
        assertEquals(con, con)
        assertEquals(con.hashCode, con.hashCode)
    }
}

这很好用。 但是,我保证一旦您习惯了Scala的优点,您也希望在测试中使用它。 因此,现在该来看看一些Scala测试框架。 Scala有两个主要的测试框架: SpecsScalaTest

ScalaTest

我选择ScalaTest是因为它支持许多不同的测试样式。 有很多实验机会。 到目前为止,我更喜欢的样式基于“功能”。 与JUnit的单一测试完全不同,它不是在单独的方法中定义的,而是将所有测试直接放置在类的主体内,并在实例化该类后立即执行。 (根据API判断,有一些方法可以对此进行微调 ,但我尚未对其进行探讨。)

测试按功能分组,每个测试都命名为场景。 由于测试不是方法,而是方法调用,因此不能将方法名称用作测试名称。 而是提供一个String参数。 这允许使用长期的描述性名称。 至少我认为这是一件好事。 我正在研究的一个小项目的一个功能规格如下所示。

class ImageComparisonTest extends FeatureSpec {
 
    feature("a user can compare the screenshot of a swing component with an image stored on disk") {
      scenario("comparing a component to a NOT matching image") {
            pending
        }
        scenario("comparing a component to a NOT existing image in headless mode") {
            pending
        }
        scenario("comparing a component to a NOT existing image in withhead mode") {
            pending
        }
    }
}

Trait FeatureSpec使功能和方案方法可用。 'pending'语句将测试标记为..好..未决,因为测试和代码都尚未实现。 即将进行的测试报告为“已忽略”。 在测试中进行断言的最简单方法是调用断言或Assertions对象的其他方法。 但是,对于指定断言的不同样式,也可以混合使用各种特征。 例如,ShouldMatchers提供了一个不错的DSL允许如下语句:

(5 * 23) should equal (115)

指定断言的步骤也可以确保在断言失败的情况下提供非常好的错误消息。 这个测试

class SomeTest extends FeatureSpec with ShouldMatchers
    feature ("ShouldMatcher provide nice error messages"){
     scenario ("Making a correct assertion"){
      (5 * 23) should equal (115)
     }
     scenario ("Making a stupid assertion"){
      (5 * 23) should equal (116)
     }
    }
}

执行时导致此错误消息:

[error] Test Failed: Feature: ShouldMatcher provide nice error messages Making a stupid assertion
org.scalatest.TestFailedException: 115 did not equal 116
        at org.scalatest.matchers.Matchers$class.newTestFailedException(Matchers.scala:148)

在JUnit测试中,有时我的测试中会有空行甚至是注释,以便从视觉上将要测试的实际操作和断言分开。 使用ScalaTest,您可以使用一种更好的方法:GivenWhenThen特性。 使用它,您无需在代码中添加注释,但可以使用带有字符串参数的方法调用,该方法将再次出现在测试的输出中:

class SomeTest extends FeatureSpec with ShouldMatchers with GivenWhenThen
    feature ("ShouldMatcher provide nice error messages"){
     scenario ("Making a correct assertion"){
      given ("a number")
      val number = 5
      and ("an other number")
      val otherNumber = 23
      when ("multiplying one with the other")
      val result = number * otherNumber
      and ("the other way round")
      val otherResult = otherNumber * number
      then ("the results will be the same")
      result should equal (otherResult)
     }
    }
}

尽管在这种琐碎的情况下,并且由于我的博客的语法突出显示功能很弱,这可能会让人分心,但实际上,它是在线注释测试的一种不错的形式。

当然,您不仅要编写测试,还希望它们也执行。 有用于JUnit和TestNG的运行器,因此您可以使用惯用的测试框架执行ScalaTests。 但我绝对建议您使用sbt直接执行测试。 Sbt是一个简单的构建工具 。 设置非常简单,您可以通过输入〜test启动它,并在保存代码时运行所有测试。 真的很好,特别是因为它比我到目前为止看到的IDE中的scala编译器快得多。

这只是使用Scala(Test)进行测试的可能性的一小部分。 我期待着进一步探索。

参考:来自Schauderhaft博客的JCG合作伙伴 Jens Schauder 使用Scala进行测试

相关文章 :


翻译自: https://www.javacodegeeks.com/2011/09/testing-with-scala.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值