iT邦幫忙

0

iOS APP iOS Test-Driven Development by Tutorials free section 學習筆記-the TDD Cycle 2

iOS APP iOS Test-Driven Development by Tutorials free section 學習筆記-the TDD Cycle 2

tags: TDD day

TDD Cycle

上一篇筆記,您了解了測試驅動的開發可以歸結為一個簡單的過程,稱為TDD Cycle。它有四個步驟,通常被“color coded”,如下所示:
我們稱它為“Red-Green-Refactor Cycle”

圖片來源

  • 失敗時,以 Red為顏色標記
  • 通過時,以 green 為顏色標記
  • 通過後進入 Refactor階段

不斷的循環。

Get start

延續上一個邏輯。當帳號與密碼都正確時,loginButton的state要是normal

當帳號與密碼都錯誤時,loginButton的state要是disable

當只有帳號是正確時,loginButton的state要是disable

當只有密碼是正確時,loginButton的state要是disable

一路綠燈,一路爽

這個時候,你真的該注意了。因為如果都是綠燈,就代表你根本不知道錯誤會在哪。

沒有 Failing Test 就不該走到 Make it Pass

流程是 Red --> Green --> Refactor 。如果是Green就代表這個 Test 或許根本就是多餘的。

  • 把當帳號與密碼都錯誤時,loginButton的state要是disable
  • 當只有帳號是正確時,loginButton的state要是disable
  • 當只有密碼是正確時,loginButton的state要是disable

把以上三個都刪掉。

我們應該把注意力放在會導致錯誤的操作

讓帳號與密碼都填入後,登入按鈕就會進入normal的state。
但是如果再把帳號刪掉呢?是不是登入按鈕就該進入 disable的 state?

加入所構想的 test,測試看看

    func testLoginPageViewController_loginStateIspbothCorrectAndPasswordCorrect_loginButtonIsDisable(){
        //given
        let firstState:LoginState = .bothCorrect
        let secondState:LoginState = .passwordCorrect
        // when
        sut.loginState = firstState
        sut.loginState = secondState
        //then
        let loginState = sut.loginPageView.loginButton.state
        XCTAssertEqual(loginState, UIButton.State.disabled)
    }

結果:Failing Test

很好,我們達成目的了。

記住,TDD 的第一個目標就是要有Fail Test

Green: Make it Pass

我們來思考看看 Fail Test的原因
這是目前狀態下的時序圖

 sequenceDiagram;
觸發條件 ->> 觸發對象 : 條件成立
觸發對象 -->> 觸發條件 : true
觸發條件 ->> 觸發對象 : 條件不成立
觸發對象 -->> 觸發條件 : true

這是理想狀態下的時序圖

 sequenceDiagram;
觸發條件 ->> 觸發對象 : 條件成立
觸發對象 -->> 觸發條件 : true
觸發條件 ->> 觸發對象 : 條件不成立
觸發對象 -->> 觸發條件 : false

可以看到,當條件不符合時,觸發對象應該要回傳False,而不是繼續回傳true。

簡單修改一下邏輯。command + u
很好,一經通過測試了。可以開始進行下一個階段。

Refactor

TDD 都優勢是,可以頻繁的 Refactor,而且每次的 Refactor有自動化測試可以幫你驗證。
我將多餘的參數抽出,然後簡化多餘的描述語法。command + u

終於再一次地完成了 TDD Cycle

TDD 的開發速度,真的很慢。希望在下一次的開發速度可以有所增長。
下一篇還會繼續分享,下一個 TDD Cycle


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言