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

前言

自己做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ò)使用布爾斷言XCTAssertTrueXCTAssertFalse,我們可以避免測(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é)果

截屏2021-07-05 下午12.03.47.png
  • 第一個(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 ?

答案是

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

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)題。因此,只要您想將XCTAssertEqualDoubleFloat類(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ì)更有利于理解.

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

我們對(duì)最常見(jiàn)的 XCTest斷言的介紹到此結(jié)束。 后面會(huì)介紹一些使用場(chǎng)景.

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

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

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