利用TDD理清思路

TDD 有助于理清思路蓝牲。實(shí)踐 TDD 的步驟如下:

  1. 明確功能
  2. 驗(yàn)證功能(寫測試)
  3. 實(shí)現(xiàn)功能
  4. 運(yùn)行測試
  5. 修改功能 (非必須)

其中第一步是理清思路,在紙上寫寫畫畫泰讽,細(xì)分功能例衍,不需要寫代碼昔期。大多程序員不管三七二十一,想到什么就寫什么肄渗,盡快上手寫代碼镇眷,出現(xiàn)問題了再修補(bǔ),思路不清晰翎嫡。其實(shí)這一步才是最重要的欠动。

拿修改密碼功能舉例,例子中使用后端語言為 Ruby惑申,Web 框架是 RoR具伍,測試框架 Rspec。不了解該語言可以把代碼當(dāng)偽代碼看,畢竟 Ruby 很接近自然語言 :)

  1. 明確功能:
    該功能的效果:用戶修改密碼后,密碼會(huì)變(廢話)遗嗽,需要使用新密碼登錄荐类。
    實(shí)現(xiàn)方法如下:
    驗(yàn)證舊密碼與現(xiàn)在的密碼是否一致 => 修改密碼,該功能比較簡單入录。

  2. 驗(yàn)證功能(寫測試):
    創(chuàng)建用戶 => 調(diào)用修改密碼接口 => 檢驗(yàn)密碼是否改為新密碼

# spec/controllers/api/users_controller_spec.rb
RSpec.describe Api::UsersController type: :controller do
  describe '#change_password' do
    old_pwd = 'adfslkj'
    new_pwd = '87234sd'
    user = create(:user, password: old_pwd)

    session[:user_id] = user.id # 通過會(huì)話標(biāo)記登錄狀態(tài)
    post(:change_password, params: { old_pwd: old_pwd, new_pwd: new_pwd, confirmed_pwd: new_pwd } )
    expect(response.status).to eq(200) # 檢驗(yàn)是否返回成功的響應(yīng)
    
    user.reload # 成功調(diào)用接口后,密碼應(yīng)該變了,重新從數(shù)據(jù)庫獲取用戶
    expect(user.valid_password?(old_pwd)).not_to be_truthy # 舊密碼失效
    expect(user.valid_password?(new_pwd)).to be_truthy # 判斷傳到接口的新密碼現(xiàn)在是否為有效的密碼
  end
end

現(xiàn)在運(yùn)行測試惕味,還沒寫功能,測試肯定不通過玉锌。

$ rspec spec/controllers/api/users_controller_spec.rb
# 失敗
  1. 實(shí)現(xiàn)功能:
    實(shí)現(xiàn)方法主要如步驟 1 所說名挥。
    驗(yàn)證舊密碼與現(xiàn)在的密碼是否一致 => 修改密碼
# app/controllers/api/users_controller.rb
...
def change_password
  old_pwd, new_pwd, confirmed_pwd = require_params!(:old_pwd, :new_pwd, :confirm_pwd)
  if !current_user.valid_password?(old_pwd)
    return fail_res(400, '無效的舊密碼')
  end
  current_user.update!(password: new_pwd) # 修改密碼
  res(200, '修改成功')
end
...

看吧,很簡單主守,幾行代碼就搞定禀倔。不過有些異常情況沒處理,我們稍后再講参淫。

  1. 運(yùn)行測試救湖、修改功能:
    接下來運(yùn)行測試
$ rspec spec/controllers/api/users_controller_spec.rb
# 通過.

測試通過啦。然后我們還要改進(jìn)一下代碼涎才,確認(rèn)新密碼和確認(rèn)密碼是否一致捎谨。

...
def change_password
  old_pwd, new_pwd, confirmed_pwd = require_params!(:old_pwd, :new_pwd, :confirm_pwd)
  if !current_user.valid_password?(old_pwd)
    return fail_res(400, '無效的舊密碼')
  end
  if new_pwd != confirmed_pwd
    return fail_res(400, '新密碼與確認(rèn)密碼不一致')
  end
  current_user.update!(password: new_pwd) # 修改密碼
  res(200, '修改成功')
end
...

寫好測試后,以后就可以放心修改這個(gè)接口憔维,或者是重構(gòu)跟用戶密碼有關(guān)的代碼涛救。只要重構(gòu)后可以通過測試,就比較可靠了业扒。
要是遇到?jīng)]想到的異常情況检吆,再補(bǔ)多一個(gè)測試就好了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末程储,一起剝皮案震驚了整個(gè)濱河市蹭沛,隨后出現(xiàn)的幾起案子臂寝,更是在濱河造成了極大的恐慌,老刑警劉巖摊灭,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咆贬,死亡現(xiàn)場離奇詭異,居然都是意外死亡帚呼,警方通過查閱死者的電腦和手機(jī)掏缎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煤杀,“玉大人眷蜈,你說我怎么就攤上這事∩蜃裕” “怎么了酌儒?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長枯途。 經(jīng)常有香客問我忌怎,道長,這世上最難降的妖魔是什么酪夷? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任呆躲,我火速辦了婚禮,結(jié)果婚禮上捶索,老公的妹妹穿的比我還像新娘。我一直安慰自己灰瞻,他們只是感情好腥例,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著酝润,像睡著了一般燎竖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上要销,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天构回,我揣著相機(jī)與錄音,去河邊找鬼疏咐。 笑死纤掸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浑塞。 我是一名探鬼主播借跪,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酌壕!你這毒婦竟也來了掏愁?” 一聲冷哼從身側(cè)響起歇由,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎果港,沒想到半個(gè)月后沦泌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辛掠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年谢谦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片公浪。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡他宛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出欠气,到底是詐尸還是另有隱情厅各,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布预柒,位于F島的核電站队塘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宜鸯。R本人自食惡果不足惜憔古,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淋袖。 院中可真熱鬧鸿市,春花似錦、人聲如沸即碗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剥懒。三九已至内舟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間初橘,已是汗流浹背验游。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留保檐,地道東北人耕蝉。 一個(gè)月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像夜只,于是被迫代替她去往敵國和親赔硫。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理盐肃,服務(wù)發(fā)現(xiàn)爪膊,斷路器权悟,智...
    卡卡羅2017閱讀 134,716評論 18 139
  • 用到的組件 1、通過CocoaPods安裝 2推盛、第三方類庫安裝 3峦阁、第三方服務(wù) 友盟社會(huì)化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 14,627評論 1 180
  • “夫人,家書來了”丫鬟在門外輕輕扣門耘成,洛殷整理發(fā)簪的手頓了頓榔昔,應(yīng)聲道:“進(jìn)來吧”窬”門外的丫鬟緩緩?fù)崎_門撒会,平日里的貼...
    紅姀閱讀 229評論 0 0
  • 兵哥哥休假回來了诵肛,她竟然有一種恍如隔世的感覺。 日子就像回憶錄一般默穴,在腦海中開始播放怔檩。 昨天晚上,握著發(fā)燙手機(jī)的她...
    小曉曉雨菇?jīng)?/span>閱讀 718評論 1 4
  • 這個(gè)夏天我買了七雙鞋蓄诽。 兩雙運(yùn)動(dòng)鞋薛训,其中一雙穿了一個(gè)星期后不喜歡了,就送給了我媽媽仑氛。另外一雙幾乎每次去上瑜伽課的時(shí)...
    琴瑟沉香閱讀 818評論 1 1