iOS UnitTest 學(xué)習(xí) (一)了解斷言

前言

自己做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)
    }

通過使用布爾斷言XCTAssertTrueXCTAssertFalse,我們可以避免測試代碼中的許多條件。

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é)果

截屏2021-07-05 下午12.03.47.png
  • 第一個
    我們輸入了一個純字符串文字 “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 ?

答案是

截屏2021-07-05 下午10.49.31.png

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)致問題。因此,只要您想將XCTAssertEqualDoubleFloat類型一起使用,需要使用準(zhǔn)確度參數(shù)。

斷言的備注消息

    func test_messageOverkill() {
        let actual = "actual"
        XCTAssertEqual(actual, "expected","Expected \"expected\" but got \"\(actual)\"")
    }

每個斷言可以有一個可選的消息,但是請不要過度使用,大多數(shù)情況下直接使用 XCTAssertEqual,XCTAssertTrue等簡單的方式,會更有利于理解.

截屏2021-07-06 上午12.06.23.png

我們對最常見的 XCTest斷言的介紹到此結(jié)束。 后面會介紹一些使用場景.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容