Chapter 14 《Assertions and Tests》

查看软件是否符合预期的两个主要工具为断言和测试。


断言
    1. 主要是对assert函数的调用,可以直接放入一个condition,或者是assert(condition,explanation),会调用explanationtoString方法输出出错信息。
    1. 使用ensuring方法,这个方法可以被应用于任何类型,主要是因为一个隐式转换。使用隐式类Ensuring(x: A)进行隐式转换。
    1. 断言可以使用JVM的命令-ea-da打开或者关闭,打开时,断言就像是一个小的测试,使用的是运行时刻的真实数据。

Scala测试
    1. 这章的目的在于编写外部测试,这些测试自己提供测试数据,并且独立于程序运行。有很多选择,比如说JUnitTestNG或者使用Scala编写的测试工具,ScalaTestspecs2ScalaCheck
    1. ScalaTest是最灵活的Scala测试框架,其核心概念是suite,也就是测试的集合。Suite特质是核心组合单元,声明了一组“生命周期”方法,定义了测试的默认运行方式。
    1. ScalaTest提供了style trait,这些特质扩展了Suite并重写了生命周期方法用来支持不同的测试风格,提供了mixin trait并重写了生命周期方法来支持不同的测试风格。最后可以通过组合style traitmixin trait来定义测试类,并结合Suite实例来定义测试套件。
import org.scalatest.FunSuite
import Element.elem
class ElementSuite extends FunSuite {
test("elem result should have passed width") {
val ele = elem('x', 2, 3)
assert(ele.width == 2)
}
}

FunSuite就是风格测试的一个例子。Fun指的是函数,test是定义在FunSuite中的一个方法,被ElementSuite的主构造方法调用,可以在()给出测试的名称,在{}给出具体的测试代码,但test说到底还是一个函数,接收一个String类型参数和一个函数类型参数,函数类型参数是传名参数。

    1. ScalaTest已经被集成在sbt或者IDE上,可以通过ScalaTestRunner工具直接运运行Suite,或者在解释器中调用execute方法,比如(new ElementSuite).execute
    1. 在测试中所选的风格不一样仅仅规定了测试代码不一样,ScalaTest的运行机制都是一样的。

测试报告
    1. ScalaTest中的DiagrammedAssertions,并不在错误消息中指出错误和预期,仅仅是指出错误,如果需要预期的话,可以使用assertResult(expected){parameter}assertThrows[expectedException]{parameter},可以用来检测是否抛出了期望的异常。
    1. intercept方法和assertThrows的运行机制是一样的,但是当assert失败的时候,intercept可以捕获这个异常。

作为规格说明的测试
    1. 驱动开发测试风格主要是编写人类可读的关于代码预期行为的规格说明,同时给出验证这些行为的测试代码。 FlatSpec就支持这种风格的测试。在FlatSpec中,使用规格子句的形式来编写测试。
class ElementSpec extends FlatSpec with Matchers {
"A UniformElement" should
"have a width equal to the passed value" in {
val ele = elem('x', 2, 3)
ele.width should be (2)
}
it should "have a height equal to the passed value" in {
val ele = elem('x', 2, 3)
ele.height should be (3)
}
it should "throw an IAE if passed a negative width" in {
an [IllegalArgumentException] should be thrownBy {
elem('x', -2, 3)
}
}
}

规格子句有A UniformElement表示要测试的主体,然后是should,must,canhave a width equal to the passed value为描述主体具有某种行为的字符串,然后是in,在in中编写用于测试指定行为的代码。

    1. 在后续的子句中,可以使用it来代替最近的主体。当一个FlatSpec被执行的时候,其中的每一个规格子句都以ScalaTest测试进行执行。其中包含匹配器,通过混入匹配器,可以编写读上去更像自然语言的断言。ScalaTest在其DSL中提供了许多匹配器,并与徐使用定制的失败消息定义新的匹配器。比如should be,an [……] should be thrownBy {……},当然也可以混入MustMatchers

基于特质的测试
    1. Scala中另外一个有用的测试工具是ScalaCheck,能够指定被测试的代码必须满足的性质。对每个性质,ScalaCheck都会生成数据被执行断言,检查代码是否满足该性质。

你可能感兴趣的:(Chapter 14 《Assertions and Tests》)