01|TDD演示(1):任務(wù)分解法與整體工作流程
測試驅(qū)動開發(fā)秘蛇,顧名思義咪奖,就是將軟件需求轉(zhuǎn)化為一組自動化測試,然后再根據(jù)測試描繪的場景格郁,逐步實(shí)現(xiàn)軟件功能的開發(fā)方法。
TDD 的基本原則
為了讓我的演示更有針對性独悴,有些基本原則你需要先了解一下例书。TDD 的創(chuàng)始人 Kent Beck,在他的傳世大作 Test-Driven Development by Example 的開篇中給出了 TDD 的基本原則:
- 當(dāng)且僅當(dāng)存在失敗的自動化測試時(shí)刻炒,才開始編寫生產(chǎn)代碼决采;
- 消除重復(fù)。
不過在今時(shí)今日坟奥,我認(rèn)為第二條應(yīng)該改為“消除壞味道(Bad Smell)”织狐。畢竟重復(fù)僅僅是一種壞味道,還有很多不是重復(fù)的壞味道筏勒。
那么根據(jù) TDD 的基本原則移迫,Kent Beck 將開發(fā)工作分成了三步,也就是后世廣為流傳的測試驅(qū)動開發(fā)咒語——紅 / 綠 / 重構(gòu)(Red/Green/Refactoring):
紅:編寫一個(gè)失敗的小測試管行,甚至可以是無法編譯的測試厨埋;
綠:讓這個(gè)測試快速通過,甚至不惜犯下任何罪惡捐顷;
重構(gòu):消除上一步中產(chǎn)生的所有重復(fù)(壞味道)荡陷。
然而紅 / 綠 / 重構(gòu)循環(huán)僅僅關(guān)注單個(gè)測試這個(gè)層面雨效,它沒有回答測試從何而來。于是很多嘗試采用 TDD 的人都卡在了第零步:我該寫哪些測試废赞?于是在 2006 年前后我總結(jié)了任務(wù)分解法徽龟,將任務(wù)列表作為 TDD 的核心要素。
任務(wù)分解法的步驟如下:
大致構(gòu)思軟件被使用的方式唉地,把握對外接口的方向据悔;
大致構(gòu)思功能的實(shí)現(xiàn)方式,劃分所需的組件(Component)以及組件間的關(guān)系(所謂的架構(gòu))耘沼。當(dāng)然极颓,如果沒思路,也可以不劃分群嗤;
根據(jù)需求的功能描述拆分功能點(diǎn)菠隆,功能點(diǎn)要考慮正確路徑(Happy Path)和邊界條件(Sad Path);
依照組件以及組件間的關(guān)系狂秘,將功能拆分到對應(yīng)組件骇径;
針對拆分的結(jié)果編寫測試,進(jìn)入紅 / 綠 / 重構(gòu)循環(huán)者春。
那么 TDD 的整體工作流程如下圖所示:
命令行參數(shù)解析
我們中的大多數(shù)人都不得不時(shí)不時(shí)地解析一下命令行參數(shù)破衔。如果我們沒有一個(gè)方便的工具,那么我們就簡單地處理一下傳入 main 函數(shù)的字符串?dāng)?shù)組碧查。有很多開源工具可以完成這個(gè)任務(wù)运敢,但它們可能并不能完全滿足我們的要求。所以我們再寫一個(gè)吧忠售。
傳遞給程序的參數(shù)由標(biāo)志和值組成传惠。標(biāo)志應(yīng)該是一個(gè)字符,前面有一個(gè)減號稻扬。每個(gè)標(biāo)志都應(yīng)該有零個(gè)或多個(gè)與之相關(guān)的值卦方。例如:
-l -p 8080 -d /usr/logs
“l(fā)”(日志)沒有相關(guān)的值,它是一個(gè)布爾標(biāo)志泰佳,如果存在則為 true盼砍,不存在則為 false。
“p”(端口)有一個(gè)整數(shù)值逝她,“d”(目錄)有一個(gè)字符串值浇坐。標(biāo)志后面如果存在多個(gè)值,則該標(biāo)志表示一個(gè)列表:
-g this is a list -d 1 2 -3 5
"g"表示一個(gè)字符串列表[“this”, “is”, “a”, “l(fā)ist”]黔宛,“d"標(biāo)志表示一個(gè)整數(shù)列表[1, 2, -3, 5]近刘。
如果參數(shù)中沒有指定某個(gè)標(biāo)志,那么解析器應(yīng)該指定一個(gè)默認(rèn)值。例如觉渴,false 代表布爾值介劫,0 代表數(shù)字,”"代表字符串案淋,[]代表列表座韵。如果給出的參數(shù)與模式不匹配,重要的是給出一個(gè)好的錯誤信息踢京,準(zhǔn)確地解釋什么是錯誤的誉碴。
確保你的代碼是可擴(kuò)展的,即如何增加新的數(shù)值類型是直接和明顯的漱挚。
API 構(gòu)思與組件劃分
利用Options注解來簡化設(shè)計(jì)翔烁,API風(fēng)格更加友好渺氧,有點(diǎn)門檻旨涝。我查一下Go語言是怎么支持的。
這并不像很多原教旨主義 TDD 實(shí)踐者所推崇的那樣侣背,完全依賴重構(gòu)而不去做設(shè)計(jì)白华。然而以我二十年來實(shí)踐 TDD 的經(jīng)驗(yàn)來看,理解需求贩耐,并通過測試構(gòu)成高效的節(jié)奏弧腥,是有效實(shí)施 TDD 的前提。特別是在有其他團(tuán)隊(duì)成員的情況下(結(jié)對或項(xiàng)目組)潮太,更需要如此管搪。
內(nèi)容來源:極客時(shí)間《徐昊 · TDD 項(xiàng)目實(shí)戰(zhàn) 70 講」》https://time.geekbang.org/column/article/494207