Chapter 14 《Assertions and Tests》
程序员文章站
2024-02-27 14:37:33
...
查看软件是否符合预期的两个主要工具为断言和测试。
断言
- 主要是对
assert
函数的调用,可以直接放入一个condition
,或者是assert(condition,explanation)
,会调用explanation
的toString
方法输出出错信息。
- 主要是对
- 使用
ensuring
方法,这个方法可以被应用于任何类型,主要是因为一个隐式转换。使用隐式类Ensuring(x: A)进行隐式转换。
- 使用
- 断言可以使用
JVM
的命令-ea
和-da
打开或者关闭,打开时,断言就像是一个小的测试,使用的是运行时刻的真实数据。
- 断言可以使用
Scala测试
- 这章的目的在于编写外部测试,这些测试自己提供测试数据,并且独立于程序运行。有很多选择,比如说
JUnit
,TestNG
或者使用Scala
编写的测试工具,ScalaTest
,specs2
和ScalaCheck
。
- 这章的目的在于编写外部测试,这些测试自己提供测试数据,并且独立于程序运行。有很多选择,比如说
-
ScalaTest
是最灵活的Scala
测试框架,其核心概念是suite
,也就是测试的集合。Suite
特质是核心组合单元,声明了一组“生命周期”方法,定义了测试的默认运行方式。
-
-
ScalaTest
提供了style trait
,这些特质扩展了Suite
并重写了生命周期方法用来支持不同的测试风格,提供了mixin trait
并重写了生命周期方法来支持不同的测试风格。最后可以通过组合style trait
和mixin 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
类型参数和一个函数类型参数,函数类型参数是传名参数。
-
ScalaTest
已经被集成在sbt
或者IDE
上,可以通过ScalaTest
的Runner
工具直接运运行Suite
,或者在解释器中调用execute
方法,比如(new ElementSuite).execute
-
- 在测试中所选的风格不一样仅仅规定了测试代码不一样,
ScalaTest
的运行机制都是一样的。
- 在测试中所选的风格不一样仅仅规定了测试代码不一样,
测试报告
-
ScalaTest
中的DiagrammedAssertions
,并不在错误消息中指出错误和预期,仅仅是指出错误,如果需要预期的话,可以使用assertResult(expected){parameter}
,assertThrows[expectedException]{parameter}
,可以用来检测是否抛出了期望的异常。
-
-
intercept
方法和assertThrows
的运行机制是一样的,但是当assert
失败的时候,intercept
可以捕获这个异常。
-
作为规格说明的测试
- 驱动开发测试风格主要是编写人类可读的关于代码预期行为的规格说明,同时给出验证这些行为的测试代码。
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,can
,have a width equal to the passed value
为描述主体具有某种行为的字符串,然后是in
,在in
中编写用于测试指定行为的代码。
- 在后续的子句中,可以使用
it
来代替最近的主体。当一个FlatSpec
被执行的时候,其中的每一个规格子句都以ScalaTest
测试进行执行。其中包含匹配器,通过混入匹配器,可以编写读上去更像自然语言的断言。ScalaTest
在其DSL
中提供了许多匹配器,并与徐使用定制的失败消息定义新的匹配器。比如should be,an [……] should be thrownBy {……}
,当然也可以混入MustMatchers
- 在后续的子句中,可以使用
基于特质的测试
-
Scala
中另外一个有用的测试工具是ScalaCheck
,能够指定被测试的代码必须满足的性质。对每个性质,ScalaCheck
都会生成数据被执行断言,检查代码是否满足该性质。
-
上一篇: python算法表示概念扫盲教程
下一篇: nvidia-docker 的使用
推荐阅读
-
Chapter 14 《Assertions and Tests》
-
温习Android基础知识——《第一行代码(第三版)》读书笔记 Chapter 14 高级技巧
-
Exception in thread "main" java.lang.Error: Always run main and tests with assertions enabled
-
视觉 slam14讲Chapter (5)程序执行
-
Chapter1SecuringYourServerandNetwork(14):限制功能xp_cmds
-
Chapter 14. Type Information -- Thinking in Java
-
温习Android基础知识——《第一行代码(第三版)》读书笔记 Chapter 14 高级技巧
-
pytest学习2: The writing and reporting of assertions in tests