查看軟件是否符合預(yù)期的兩個主要工具為斷言和測試因篇。
斷言
- 主要是對
assert
函數(shù)的調(diào)用,可以直接放入一個condition
猴娩,或者是assert(condition,explanation)
橡娄,會調(diào)用explanation
的toString
方法輸出出錯信息拔莱。
- 主要是對
- 使用
ensuring
方法,這個方法可以被應(yīng)用于任何類型匿又,主要是因為一個隱式轉(zhuǎn)換方灾。使用隱式類Ensuring(x: A)進(jìn)行隱式轉(zhuǎn)換。
- 使用
- 斷言可以使用
JVM
的命令-ea
和-da
打開或者關(guān)閉碌更,打開時裕偿,斷言就像是一個小的測試,使用的是運(yùn)行時刻的真實數(shù)據(jù)痛单。
- 斷言可以使用
Scala測試
- 這章的目的在于編寫外部測試嘿棘,這些測試自己提供測試數(shù)據(jù),并且獨(dú)立于程序運(yùn)行旭绒。有很多選擇鸟妙,比如說
JUnit
,TestNG
或者使用Scala
編寫的測試工具挥吵,ScalaTest
重父,specs2
和ScalaCheck
。
- 這章的目的在于編寫外部測試嘿棘,這些測試自己提供測試數(shù)據(jù),并且獨(dú)立于程序運(yùn)行旭绒。有很多選擇鸟妙,比如說
-
ScalaTest
是最靈活的Scala
測試框架忽匈,其核心概念是suite
房午,也就是測試的集合。Suite
特質(zhì)是核心組合單元脉幢,聲明了一組“生命周期”方法歪沃,定義了測試的默認(rèn)運(yùn)行方式。
-
-
ScalaTest
提供了style trait
嫌松,這些特質(zhì)擴(kuò)展了Suite
并重寫了生命周期方法用來支持不同的測試風(fēng)格沪曙,提供了mixin trait
并重寫了生命周期方法來支持不同的測試風(fēng)格。最后可以通過組合style trait
和mixin trait
來定義測試類萎羔,并結(jié)合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
就是風(fēng)格測試的一個例子。Fun
指的是函數(shù)贾陷,test
是定義在FunSuite
中的一個方法缘眶,被ElementSuite
的主構(gòu)造方法調(diào)用,可以在()
給出測試的名稱髓废,在{}
給出具體的測試代碼巷懈,但test
說到底還是一個函數(shù),接收一個String
類型參數(shù)和一個函數(shù)類型參數(shù)慌洪,函數(shù)類型參數(shù)是傳名參數(shù)顶燕。
-
ScalaTest
已經(jīng)被集成在sbt
或者IDE
上凑保,可以通過ScalaTest
的Runner
工具直接運(yùn)運(yùn)行Suite
,或者在解釋器中調(diào)用execute
方法涌攻,比如(new ElementSuite).execute
-
- 在測試中所選的風(fēng)格不一樣僅僅規(guī)定了測試代碼不一樣欧引,
ScalaTest
的運(yùn)行機(jī)制都是一樣的。
- 在測試中所選的風(fēng)格不一樣僅僅規(guī)定了測試代碼不一樣欧引,
測試報告
-
ScalaTest
中的DiagrammedAssertions
恳谎,并不在錯誤消息中指出錯誤和預(yù)期芝此,僅僅是指出錯誤,如果需要預(yù)期的話因痛,可以使用assertResult(expected){parameter}
婚苹,assertThrows[expectedException]{parameter}
,可以用來檢測是否拋出了期望的異常鸵膏。
-
-
intercept
方法和assertThrows
的運(yùn)行機(jī)制是一樣的租副,但是當(dāng)assert
失敗的時候,intercept
可以捕獲這個異常较性。
-
作為規(guī)格說明的測試
- 驅(qū)動開發(fā)測試風(fēng)格主要是編寫人類可讀的關(guān)于代碼預(yù)期行為的規(guī)格說明,同時給出驗證這些行為的測試代碼结胀。
FlatSpec
就支持這種風(fēng)格的測試赞咙。在FlatSpec
中,使用規(guī)格子句的形式來編寫測試糟港。
- 驅(qū)動開發(fā)測試風(fēng)格主要是編寫人類可讀的關(guān)于代碼預(yù)期行為的規(guī)格說明,同時給出驗證這些行為的測試代碼结胀。
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) } } }
規(guī)格子句有A UniformElement
表示要測試的主體攀操,然后是should,must秸抚,can
速和,have a width equal to the passed value
為描述主體具有某種行為的字符串,然后是in
剥汤,在in
中編寫用于測試指定行為的代碼颠放。
- 在后續(xù)的子句中,可以使用
it
來代替最近的主體吭敢。當(dāng)一個FlatSpec
被執(zhí)行的時候碰凶,其中的每一個規(guī)格子句都以ScalaTest
測試進(jìn)行執(zhí)行。其中包含匹配器鹿驼,通過混入匹配器欲低,可以編寫讀上去更像自然語言的斷言。ScalaTest
在其DSL
中提供了許多匹配器畜晰,并與徐使用定制的失敗消息定義新的匹配器砾莱。比如should be,an [……] should be thrownBy {……}
凄鼻,當(dāng)然也可以混入MustMatchers
- 在后續(xù)的子句中,可以使用
基于特質(zhì)的測試
-
Scala
中另外一個有用的測試工具是ScalaCheck
腊瑟,能夠指定被測試的代碼必須滿足的性質(zhì)聚假。對每個性質(zhì),ScalaCheck
都會生成數(shù)據(jù)被執(zhí)行斷言扫步,檢查代碼是否滿足該性質(zhì)魔策。
-