Chapter 14 《Assertions and Tests》

查看軟件是否符合預(yù)期的兩個主要工具為斷言和測試因篇。


斷言
    1. 主要是對assert函數(shù)的調(diào)用,可以直接放入一個condition猴娩,或者是assert(condition,explanation)橡娄,會調(diào)用explanationtoString方法輸出出錯信息拔莱。
    1. 使用ensuring方法,這個方法可以被應(yīng)用于任何類型匿又,主要是因為一個隱式轉(zhuǎn)換方灾。使用隱式類Ensuring(x: A)進(jìn)行隱式轉(zhuǎn)換。
    1. 斷言可以使用JVM的命令-ea-da打開或者關(guān)閉碌更,打開時裕偿,斷言就像是一個小的測試,使用的是運(yùn)行時刻的真實數(shù)據(jù)痛单。

Scala測試
    1. 這章的目的在于編寫外部測試嘿棘,這些測試自己提供測試數(shù)據(jù),并且獨(dú)立于程序運(yùn)行旭绒。有很多選擇鸟妙,比如說JUnitTestNG或者使用Scala編寫的測試工具挥吵,ScalaTest重父,specs2ScalaCheck
    1. ScalaTest是最靈活的Scala測試框架忽匈,其核心概念是suite房午,也就是測試的集合。Suite特質(zhì)是核心組合單元脉幢,聲明了一組“生命周期”方法歪沃,定義了測試的默認(rèn)運(yùn)行方式。
    1. ScalaTest提供了style trait嫌松,這些特質(zhì)擴(kuò)展了Suite并重寫了生命周期方法用來支持不同的測試風(fēng)格沪曙,提供了mixin trait并重寫了生命周期方法來支持不同的測試風(fēng)格。最后可以通過組合style traitmixin 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ù)顶燕。

    1. ScalaTest已經(jīng)被集成在sbt或者IDE上凑保,可以通過ScalaTestRunner工具直接運(yùn)運(yùn)行Suite,或者在解釋器中調(diào)用execute方法涌攻,比如(new ElementSuite).execute
    1. 在測試中所選的風(fēng)格不一樣僅僅規(guī)定了測試代碼不一樣欧引,ScalaTest的運(yùn)行機(jī)制都是一樣的。

測試報告
    1. ScalaTest中的DiagrammedAssertions恳谎,并不在錯誤消息中指出錯誤和預(yù)期芝此,僅僅是指出錯誤,如果需要預(yù)期的話因痛,可以使用assertResult(expected){parameter}婚苹,assertThrows[expectedException]{parameter},可以用來檢測是否拋出了期望的異常鸵膏。
    1. intercept方法和assertThrows的運(yùn)行機(jī)制是一樣的租副,但是當(dāng)assert失敗的時候,intercept可以捕獲這個異常较性。

作為規(guī)格說明的測試
    1. 驅(qū)動開發(fā)測試風(fēng)格主要是編寫人類可讀的關(guān)于代碼預(yù)期行為的規(guī)格說明,同時給出驗證這些行為的測試代碼结胀。 FlatSpec就支持這種風(fēng)格的測試赞咙。在FlatSpec中,使用規(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中編寫用于測試指定行為的代碼颠放。

    1. 在后續(xù)的子句中,可以使用it來代替最近的主體吭敢。當(dāng)一個FlatSpec被執(zhí)行的時候碰凶,其中的每一個規(guī)格子句都以ScalaTest測試進(jìn)行執(zhí)行。其中包含匹配器鹿驼,通過混入匹配器欲低,可以編寫讀上去更像自然語言的斷言。ScalaTest在其DSL中提供了許多匹配器畜晰,并與徐使用定制的失敗消息定義新的匹配器砾莱。比如should be,an [……] should be thrownBy {……}凄鼻,當(dāng)然也可以混入MustMatchers

基于特質(zhì)的測試
    1. Scala中另外一個有用的測試工具是ScalaCheck腊瑟,能夠指定被測試的代碼必須滿足的性質(zhì)聚假。對每個性質(zhì),ScalaCheck都會生成數(shù)據(jù)被執(zhí)行斷言扫步,檢查代碼是否滿足該性質(zhì)魔策。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市河胎,隨后出現(xiàn)的幾起案子闯袒,更是在濱河造成了極大的恐慌,老刑警劉巖游岳,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件政敢,死亡現(xiàn)場離奇詭異,居然都是意外死亡胚迫,警方通過查閱死者的電腦和手機(jī)喷户,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來访锻,“玉大人褪尝,你說我怎么就攤上這事∑谌” “怎么了河哑?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長龟虎。 經(jīng)常有香客問我璃谨,道長,這世上最難降的妖魔是什么鲤妥? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任佳吞,我火速辦了婚禮,結(jié)果婚禮上棉安,老公的妹妹穿的比我還像新娘底扳。我一直安慰自己,他們只是感情好垂券,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布花盐。 她就那樣靜靜地躺著,像睡著了一般菇爪。 火紅的嫁衣襯著肌膚如雪算芯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天凳宙,我揣著相機(jī)與錄音熙揍,去河邊找鬼。 笑死氏涩,一個胖子當(dāng)著我的面吹牛届囚,可吹牛的內(nèi)容都是我干的有梆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼意系,長吁一口氣:“原來是場噩夢啊……” “哼泥耀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛔添,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤痰催,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后迎瞧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夸溶,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年凶硅,在試婚紗的時候發(fā)現(xiàn)自己被綠了缝裁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡足绅,死狀恐怖捷绑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情氢妈,我是刑警寧澤胎食,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站允懂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏衩匣。R本人自食惡果不足惜蕾总,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望琅捏。 院中可真熱鬧生百,春花似錦、人聲如沸柄延。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搜吧。三九已至市俊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滤奈,已是汗流浹背摆昧。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜒程,地道東北人绅你。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓伺帘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忌锯。 傳聞我的和親對象是個殘疾皇子伪嫁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Scala與Java的關(guān)系 Scala與Java的關(guān)系是非常緊密的!偶垮! 因為Scala是基于Java虛擬機(jī)张咳,也就是...
    燈火gg閱讀 3,444評論 1 24
  • 第一部分 準(zhǔn)入訓(xùn)練 第1章 進(jìn)入忍者世界 js開發(fā)人員通常使用js庫來實現(xiàn)通用和可重用的功能。這些庫需要簡單易用针史,...
    如201608閱讀 1,352評論 1 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理晶伦,服務(wù)發(fā)現(xiàn),斷路器啄枕,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 情緒:小緊張 情緒來源:明天就要在200多的廣西在粵務(wù)工的老鄉(xiāng)和領(lǐng)導(dǎo)面前代表賀州市進(jìn)行演講了婚陪,但最近事情太多,都沒...
    頑伴高振裕閱讀 139評論 0 0
  • 余少時频祝,父母異泌参,寒暑常寄于外祖。外祖張公常空,達(dá)澤十里沽一,德兼八鄉(xiāng),所居之村者漓糙,曰佐龍铣缠。依山盤落,東西而分昆禽,一水相澤蝗蛙,...
    長安舊人閱讀 1,136評論 14 25