測試驅動開發使用 Python ,第一章節

啊遠
verybuy-dev
Published in
5 min readJul 27, 2017

為何要寫心得?

  • 覺得自己對於測試還不夠瞭解,希望自己能寫出更好的 code,測試是重要的一環
  • 逼自己把書看完
  • 藉由打文章讓自己再思考一次

書的介紹

其實自己對 python 不熟,挑到這本書也就想說順便看看 python 怎麼寫的

反正測試的概念應該是一樣的吧!

如果讀英文沒有障礙的話,可以看這裡

https://www.obeythetestinggoat.com/book/praise.harry.html

有些說明的圖也會從裡面借用

這邊則是他的書裡面的範例

https://github.com/hjwp/book-example

然後他說有影片介紹第一章節,但是我找不到

這本書分三個部分,基礎知識、web開發要點、進階主題

本篇主要是針對第一部分 基礎知識 做分享

而且這本書包含了大量的示範程式碼。

對於看理論看不下去,但是看 code 卻可以很專心的人來說,比較不容易看到睡著。

不過翻譯部分還是有地方怪怪的,要對照著英文看

前提要記

我會假設你已經知道所用到的工具,例如 python、git、Selenium .. etc。

這邊我會偏重於測試的概念。

如果我有任何錯誤的地方,請讓我知道,我會非常感謝你的!

Let’s start

先看到這隻重構貓,大概是說你想戳一點小地方,然後就整隻貓下去淌混水的意思吧?

所以這本書的概念是測試羊(testing goat),

就是這本書的封面

意思是山羊一次只走一小步,所以他可以走到很高的地方

但是真的很煩

先有測試 再寫程式

而我所認知的TDD 的規則之一,先有測試 再寫程式。

我原本以為是只要先有單元測試(unit test)而已,

但這邊的 先有測試 包含了 功能測試(functional test)、單元測試(unit test)

而它的功能測試比較像我所認知的 自動化測試 ,因為他有操作到瀏覽器來查看結果。

單元測試反而比較像功能測試,因為他每個單元測試的內容似乎有點太過複雜

也許是因為這邊的範例只是為了讓讀者更容易理解在幹嘛,所以沒有寫更細

這邊回到他的定義來看的話,主要流程如下:

書上是寫:整體的 TDD 流程

而我覺得是 基本的 TDD 流程,這也是我對 TDD 的基本理解

雙迴圈 TDD (double loop TDD)

這邊用了複合的方式,被稱為 雙迴圈 TDD(double loop TDD)

他將 FT 跟 UT 結合起來

大概是

寫 FT => 寫 UT => 寫 code => 重複以上動作直到測試通過為止(看圖比較清楚)

這對我來說是個新想法,也許下次實作可以試一下這種想法

他還有提供一篇文章提供了不同觀點,但書上的網址連結已經失效

我用關鍵字找到了相關文章,有興趣的人可以讀一下

http://coding-is-like-cooking.info/2013/04/outside-in-development-with-double-loop-tdd/

如果你想要找更多相關文章的話,建議用英文找,用中文找結果根本悲劇 (* FT = functional test, UT = unit test)

紅燈 / 綠燈 / 重構

以單元測試來說的話

因為你會先寫測試 , 所以你的測試一定是不會成功的(紅燈)

然後想辦法讓你的程式碼可以通過測試 (綠燈)

最後檢查是否有重複的程式碼或是有更好的寫法,當然也要可以測試通過(重構)

資料庫相依問題

這個是困擾我很久的一個問題,可惜的是這邊是直接使用 Django 內建的方式處理掉他了

所以對於我所遇到的問題並沒有什麼幫助。

簡單講就是直接利用別人寫好的解法直接用最快

完成最低可行的網站(第六章)

看完第六章的教學範例,我會想說,

一次改一點是否真的太煩了?

但畢竟他是範例,會寫的煩躁一點。

(這邊的煩躁指的不是寫測試很煩躁,而是資料結構一直修改很煩躁

例如 其實一開始規劃就該想到 Todo list 會給很多個人用,而不是到後面才要改..之類的。他這邊是想示範新增一個新的功能去動到舊有的測試時該怎麼辦吧)

即使你在平地他還是會要你一步一步走,而不要用跑的前進

但這個概念在爬高山的地方的時候會很有用吧!

前提是就算你一開始用跑的,測試還是要有,才不會在後面往上爬的時候摔慘。

結論

前六章基本知識分了三天看完,但大多都是基礎知識

寫的範例非常仔細,對於新手來說閱讀起來比較沒有障礙吧

對於有經驗的開發者來說就會翻比較快,有些東西可以瀏覽過去即可

接下來的兩個部分會更重要也更複雜吧

也許不會像第一章一樣只要一篇文章就結束了

--

--