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


<<:  Python Flask 架站笔记 第5天 跳转讯息 删除资料 与 留言系统

>>:  React源码 commit阶段详解

Day03-搞懂传址、传值? 电脑如何储存资料?

前言 昨日我们学习了资料的型态,今天我们要来了解变数的参考。 Pass by Value ? Str...

Day-21 SONY 的刁蛮三公主、PS3 步步艰辛的复兴之路

以 PS1 和 PS2 称霸於前两个世代的 SONY、在新的世代推出的主机当然就叫做 PS3。然而身...

Day 18:浅谈软件测试

经过了差不多两周,我认为监控和警报的部分总算是告了个段落,虽然之後还需要透过实际的收集监控资料来修正...

误格式化硬碟/记忆卡/随身碟?

给大家分享一个超实用的硬碟/行动硬碟/记忆卡/随身碟误格式化资料、照片、影片的救援方法。 我们知道,...

【PHP Telegram Bot】Day20 - sendMessage:发送和转换 Markdown 讯息

今天先来点轻松的,先来看看各种 sendMessage 的功能,最後来转换使用者发送的 Markd...