前言
自己做iOS差不多5年了吧,一直都對(duì)iOS TDD , 以及Unit Test比較有興趣,但是也由于種種原因,一直沒(méi)有好好 學(xué)習(xí)/使用 iOS Unit Test這部分, 最近新?lián)Q了工作, 剛好也是有時(shí)間可以去學(xué)習(xí),所以念頭就起來(lái)了
自己學(xué)習(xí)新技術(shù)是分為理論和行為兩個(gè)部分的
一般情況下會(huì)先進(jìn)行學(xué)習(xí)如何使用,后續(xù)再進(jìn)行理論的補(bǔ)充
本篇是學(xué)習(xí)的 Unit Test的學(xué)習(xí)記錄,如果有自己理解的不對(duì)的地方歡迎指正.
XCTFail 測(cè)試中的條件
例如,像這樣測(cè)試布爾結(jié)果可能很誘人:
func test_avoidConditionalCode() {
let success = true
if !success {
XCTFail()
}
}
如果我們沒(méi)有其他斷言,那就沒(méi)問(wèn)題了。
但我們這樣嘗試另一種方式。它實(shí)現(xiàn)了相同的結(jié)果,但以一種更具聲明性的方式。
func test_assertTrue() {
let success = true
XCTAssertTrue(success)
}
通過(guò)使用布爾斷言XCTAssertTrue和XCTAssertFalse,我們可以避免測(cè)試代碼中的許多條件。
XCTAssertEqual
使用 Optional 來(lái)測(cè)試相等
Swift 的核心特性之一是可選值。當(dāng)XCTAssertEqual的參數(shù)之一是可選的時(shí),會(huì)發(fā)生什么?輸入并運(yùn)行以下測(cè)試:
func test_assertEqual_withOptional() {
let result: String? = "foo"
XCTAssertEqual(result, "foo")
}
func test_assertEqual_withOptional2() {
let result: String? = "foo"
XCTAssertEqual(result, "act")
}
結(jié)果
- 第一個(gè)
我們輸入了一個(gè)純字符串文字 “foo”作為第二個(gè)參數(shù)。它顯示測(cè)試成功.
XCTAssertEqual要求兩個(gè)參數(shù)的類(lèi)型相同。Swift 知道是否將T類(lèi)型的值分配給T類(lèi)型的變量,它可以包裝它。這將價(jià)值從非可選提升為可選。從而 foo,被包裝成 Optional類(lèi)型進(jìn)行比較
那我們?cè)趺粗浪潜话b成了 optional 類(lèi)型呢?
- 第二個(gè)
這里有報(bào)錯(cuò)信息
XCTAssertEqual failed: ("Optional("foo")") is not equal to ("Optional("act")")
當(dāng)我們使用XCTAssertEqual不需要太在意 可選類(lèi)型,方便測(cè)試的.
Doubles and Floats 類(lèi)型
func test_floatingPointDanger() {
let result = 0.1 + 0.2
XCTAssertEqual(result, 0.3)
}
在運(yùn)行測(cè)試之前,我們嘗試預(yù)測(cè)結(jié)果。你腦子里有沒(méi)有預(yù)期的結(jié)果?
0.2 + 0.1 = 0.3 ?
答案是
XCTAssertEqual failed: ("0.30000000000000004") is not equal to ("0.3")
我們習(xí)慣于使用十位數(shù)字來(lái)表示數(shù)字。但是不能用十進(jìn)制記數(shù)法寫(xiě)出 1/3, 0.3333……永遠(yuǎn)持續(xù)下去,所以寫(xiě)下的0.3是一個(gè)近似值。
由于浮點(diǎn)數(shù)是近似值,因此我們需要一種手動(dòng)方式來(lái)斷言相等
func test_floatingPointFixed() {
let result = 0.1 + 0.2
XCTAssertEqual(result, 0.3, accuracy: 0.0001)
}
該精度參數(shù)給了我們一個(gè)方式來(lái)表達(dá)忽略部分細(xì)節(jié)。運(yùn)行這個(gè)測(cè)試,你會(huì)看到它通過(guò)了。
很難提前預(yù)測(cè)哪些浮點(diǎn)數(shù)會(huì)導(dǎo)致問(wèn)題。因此,只要您想將XCTAssertEqual與Double或Float類(lèi)型一起使用,需要使用準(zhǔn)確度參數(shù)。
斷言的備注消息
func test_messageOverkill() {
let actual = "actual"
XCTAssertEqual(actual, "expected","Expected \"expected\" but got \"\(actual)\"")
}
每個(gè)斷言可以有一個(gè)可選的消息,但是請(qǐng)不要過(guò)度使用,大多數(shù)情況下直接使用 XCTAssertEqual,XCTAssertTrue等簡(jiǎn)單的方式,會(huì)更有利于理解.
我們對(duì)最常見(jiàn)的 XCTest斷言的介紹到此結(jié)束。 后面會(huì)介紹一些使用場(chǎng)景.