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