顯示具有 TDD 標籤的文章。 顯示所有文章
顯示具有 TDD 標籤的文章。 顯示所有文章

2016-09-04

受邀的TDD Workshop - Coding Dojo


今年其實我比較少接活動 但這次受到老朋友的邀請
受邀去他們部門辦一場TDD的Workshop
這是個不錯的機會能夠將這些觀念播種在公司同仁身上
於是我就準備了約4小時的課程
開場我先田野調查一下 大家開發上碰到的問題



上半場是做一些基本的Unit Test介紹
對於比較進階的打破Dependency的部分也僅僅只有點到為止

但是我發現 大家對於這塊的問題真的很感興趣

下半場則是進入今天的主題 Coding Dojo
像往常一樣讓大家試試 略有陷阱的網球計分題
讓大家體驗一下 TDD的開發模式


或許是大家都是有經驗的工程師吧
這場Coding Dojo的模式跟過去幾場比較起來比較不熱絡
反倒是問了很多實務上的問題
以下紀錄一下幾個大家提出的問題

Q1 : Stub , Mock 與 Fake的差別 ?
A1 : Stub是模擬阻礙讓測試繼續進行的石頭
        Mock比較間接 是驗證模擬對象是否預期 (你可以想成有一個函數是呼叫寄信的功能 但是我們無法驗證信到底有沒有寄到別人信箱 但是我們能有間接的方式得知到底有沒有呼叫到這個寄信函數)
        Fake是指比較接近原生物件的取代物 我會覺得也有點像Stub 但是他的對象是原生的Library. 例如 .NET Framework的物件


Q2 : 寫Unit Test 開發速度會變慢 ?
A2 : 以我自己而言 開發速度的確會稍微慢一點 有些人說需要兩倍的時間 不過我倒覺得寫UT跟一再地用手測的時間可能不會差太多 但是可以省下後面很多整合, 解Bug的時間 以及Code的品質也會比較好
資料來源 : The Art of Unit Testing: with examples in C#

Q3 : 寫Unit Test會不會造成 QA Automation出現問題 ? (註. 負負得正)
A3 : 其實這問題蠻奇怪的 我也想不出有什麼會負負得正的案例
        不過用另一個角度想 負負得正不也代表 這東西其實是有問題的 但是automation沒抓出來? 所以寫UT的效果能夠盡量讓狀態正正得正 不是才是正確的道路嗎?

Q4 : 用TDD的方式好像都沒有先想好大架構?這樣反而寫出不好的架構
A4 : 其實我自己還是會先有個初步的規劃與設計 但是TestCase仍是從需求那邊過來一步一步地建構 透過TDD的節奏 讓我能夠很快的檢視自己原本的規劃需不需要refactoring

Q5 : 專案太多Legacy Code 很多Dependency 怎麼辦?
A5 : 我不強求一定得先寫Unit Test, 所以碰到太多Dependency的就先建立一個範圍最大的一個測試 或許是Integration Test (這部分QA很厲害) 一旦測試開始建立起來 你就有信心去refactor裡面的東西 一個一個把dependency抽出來 並建立各自的Unit Test

2015-08-04

[講師] 教導公司暑期實習生 Unit-Testing & TDD Introduction (1)

很榮幸在7月底幫公司的暑期實習生上了一堂課
Unit testing & TDD Introduction

由於Target Audience都是學生
姑且猜測他們寫code經驗比較不足
所以這次就安排了Unit-Testing的基礎課程以及讓他們實作練習的Coding Dojo

今天安排了整整4小時的課程
所以我把課程切分成三部分 : 
1. 聽課
2. 實作
3. 小組報告

課程一開始 我先放個Why TDD的影片
這招是跟Daniel學的
在開頭放影片 讓準時進來的學生不無聊
讓遲到的學生就算沒看到也沒損失XD

接著我讓他們從以下四個問題挑一個來回答


然後就來玩群眾智慧的遊戲了
我請他們隨機配對
兩兩分享一下彼此的答案
然後請兩人協調出這2張答案的分數
兩張答案要共享7
簡言之就是兩者相加要等於7
最後交換手上的故事
繼續下一個配對


今天總共讓學員們隨機配對3
此時大家手上的故事應該就有3次分數的總和了




這活動的目的是為了讓他們自己決定誰的故事值得分享
分數最高的四位 也順便成為了各組小組長

沒想到大家都還蠻客氣的
3 run的總和下來 最高分才12
不過不可否認的
透過群眾智慧選出的這幾位小組長
表現上確實很有潛力喔~

分好小組之後
便開始介紹今天的主題
也透過一些簡單的實作練習讓各組建立下一堂課的實作環境

安裝nunit (unit test framework)
寫出第一個unit test project
執行第一個unit test

第二堂課是要玩codind dojo
Dojo是道場的意思
是一個能夠練習武功的地方
所以coding dojo就是個能夠讓大家安心練習寫程式的地方


今天coding dojo進行的方式是 Randori
各組同一時間只有一台電腦能寫code
各組組員輪流上台寫程式
圖片來源 : httppt.slideshare.netviniciusa1r3sapresentao-coding-dojo-em-10-minutos

各小組會有以下角色:
分別區分成 駕駛區及觀眾席




駕駛區裡坐著:
Driver : 實際下手Coding
Navigator: 可與Driver討論或提供方向
觀眾席裡就是坐著觀眾
Audience: 台下觀眾,不能介入coding

5分鐘一到,角色是會輪替的
如此一直輪替直到活動結束

今天實作的題目是:
網球計分系統

這題目看似簡單,其中卻藏了一些邏輯危機喔
真的蠻適合當作Coding Dojo Kata (練習的套路)

各小組在進行Coding Dojo
我就在各組間走動觀察

 一開始大家都還沒有進入狀況
所以20分鐘後 我中斷了Coding Dojo
請他們反省跟討論接下來的策略
接著 Coding Dojo繼續進行
很明顯地有一組已經知道怎麼玩了
開始按部就班地建立Test Case


其他組則還是在為了通過第一個測試而努力



他們的問題在於忘了Baby Step




於是我要求他們盡可能先通過第一個測試
不要想太多
不要帶太多情境
先求通過第一個測試之後再Refactor



其實TDD雖說先寫測試
但也不是先寫測試這麼地膚淺
他的一個價值在於Focus on 需求
小步小步地完成需求
所以先寫出第一個陽春版的測試並不丟臉
但同學們就是想太多了
想要一次全包
這不就又回到前面介紹的Integration Test了嗎?



最後請各小組上台Demo以及分享他們的經驗
我相信他們一定也有感受到衝擊
希望能在他們心中埋下一顆TDD的種子



下一集我們再來介紹如何寫出第一個TDD !!!