Test Driven Development

60
測測測測測測 Test Driven Development By 測測測

Transcript of Test Driven Development

Page 1: Test Driven Development

測試驅動開發Test Driven Development

By 黃升煌

Page 2: Test Driven Development

2

參考資源• 在國外不認識 Uncle Bob就等於不會 TDD

網站 : http://butunclebob.com/ArticleS.UncleBob

• 在台灣不認識 91哥就等於不會 TDD 課程 : https://skilltree.my/events/mbh 網站 : https://www.facebook.com/91agile 書單 : https://91-tdd.hackpad.com/91--SCin8rM6vpI

Page 3: Test Driven Development

這是一個開發人員小明的故事如有雷同,純屬巧合

Page 4: Test Driven Development

4

小明是個剛出社會的程式開發人員…在 XX公司擔任系統開發的工作

Page 5: Test Driven Development

5

這是小明習慣的系統開發流程…

需求 撰寫程式 手動測試 交付系統

Page 6: Test Driven Development

6

工作幾個月後,小明發現自己的工作遇到了一些問題…

Page 7: Test Driven Development

7

小明常常覺得自己開發系統像無頭蒼蠅

Page 8: Test Driven Development

8

寫出來的程式碼感覺總是難以維護

Page 9: Test Driven Development

9

辛苦開發出來的系統,總是不太符合 user的需求

Page 10: Test Driven Development

10

最討厭的是,測試程式好花時間,好不想測

所以乾脆不測或只測一些部分倒楣的是, bug都剛好發生在沒有測到的部分…

Page 11: Test Driven Development

11

主管或 user常常質問小明…

你難道都沒自己測過嗎!?

Page 12: Test Driven Development

12

小明覺得自己開發系統的工作像這樣…

Page 13: Test Driven Development

13

小明不開心

Page 14: Test Driven Development

14

不過,小明是有為上進的好青年

所以小明主動開始尋找一些好的測試方法

Page 15: Test Driven Development

15

首先,小明找到了

單元測試! (Unit Test)

Page 16: Test Driven Development

16

最小的測試單位與外部資源相依性為零不具商業邏輯測試案例之間的相依性為零一個測試案例只做一件事

小明暸解了什麼是 Unit Test

Page 17: Test Driven Development

17

Fast:可快速知道結果Isolated:與外部資源隔離Repeatable:執行 100次 100次結果應該都會一樣Self-Validation:可以直接從測試報表中理解意義或失敗原因Timely: production code與 test code同時存在

小明學到了 Unit Test的特性─ FIRST

Page 18: Test Driven Development

18

找出要測試的目標 (SUT、 System Under Test)

1. Arrange

• 初始化 SUT需要的相關參數、模擬物件2. Act

• 實際呼叫 SUT

3. Assert

• 驗證 SUT是否如預期運作

同時,小明也使用 3A Pattern來撰寫測試程式

Page 19: Test Driven Development

19

Demo一下…• 一個加法器程式 DEMO

• 為加法器加上 unit test確保程式正確

Page 20: Test Driven Development

20

有了 Unit Test之後小明…有了可以快速驗證程式邏輯正確性的工具而且在改了 A邏輯後,可以立刻知道是否影響到其他的邏輯錯誤在想得到的範圍內,加上單元測試,只要測試都是通過的,小明就可以有信心的說「在想得到的狀況內,我的程式沒有問題」

Page 21: Test Driven Development

21

但是,小明又發現了新的問題寫完程式碼,卻難以下手撰寫測試案例當需求異動時,測試案例要不要異動?常常忘了 /懶得要寫測試案例驗證程式,所以測試覆蓋率低落,改東壞西的 Bug還是常發生 (雖然比以前少 )

Page 22: Test Driven Development

22

還好,小明是有為上進的好青年

所以小明繼續尋找讓測試案例更容易應用在開發上的方法

Page 23: Test Driven Development

23

於是,小明找到了

測試驅動開發!(Test Driven Development、 TDD)

Page 24: Test Driven Development

24

關於測試驅動開發,小明學到最重要的一堂課是

重點在開發!重點在開發!重點在開發!因為很重要,所以講三次!

Page 25: Test Driven Development

25

Test Driven Development特性• 測試先行• 用測試案例代表需求• 撰寫程式來通過測試案例• 不斷重構,以增強系統架構與可維護性

小明學到了 TDD的一些特性

Page 26: Test Driven Development

26

小明學到 TDD的開發流程需求

撰寫一個測試案例

執行測試(紅燈)

針對test case撰寫程式

執行測試

測試結果為(綠燈)

重構程式碼

不需要重構程式碼

是否需要重構 是否撰寫下一個測試案例

Page 27: Test Driven Development

27

小明也學到了 TDD的三個重要原則• UncleBob: http://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd1.You are not allowed to write any production code unless it is to make a failing unit test

pass. 在有一個錯誤的測試之前不應該撰寫任何 production code

2.You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures. 當有一個失敗的測試案例 ( 編譯錯誤也是錯誤 )時,不應該撰寫更多的測試案例

3.You are not allowed to write any more production code than is sufficient to pass the one failing unit test. 除了足夠通過測試案例的程式碼以外不應該撰寫更多額外的程式碼

Page 28: Test Driven Development

28

開始使用 TDD開發後,小明覺得一次專注在一個測試案例上,更容易專心了有測試保護程式,能更容易重構程式碼,程式碼變得越來越好維護先寫測試案例再開發,測試覆蓋率極高,改東壞西的 bug發生頻率大幅降低!

Page 29: Test Driven Development

29

小明覺得很開心

Page 30: Test Driven Development

30

直到小明用 TDD 方式開發完成了第一個系統…小明才發現

跟人溝通才是開發系統最大的障礙

Page 31: Test Driven Development

31

小明想拿測試案例說明自己開發的現況

但是主管 /user才不想看到程式碼

Page 32: Test Driven Development

32

當需求異動時,雖然有測試案例保護不怕改壞程式

但異動時要修改龐大的測試程式實在好辛苦

Page 33: Test Driven Development

33

最慘的是,小明用 TDD完成了兩個需求,也通過測試案例

需求如下 :• 為了避免上下樓梯學生跌倒,我要在樓梯加裝扶手

• 測試案例 : 扶手必須是空心金屬管且佈滿邊緣• 為了避免火警,我要在走廊裝設顯眼的滅火器

• 測試案例 : 滅火器必須放置在牆上且外觀是顯眼的紅色

Page 34: Test Driven Development

34

結果開發出來是

扶手必須是空心金屬管且佈滿邊緣滅火器必須放置在牆上且外觀是顯眼的紅色

Page 35: Test Driven Development

35

User的反應

Page 36: Test Driven Development

36

主管的反應

Page 37: Test Driven Development

37

小明不開心

Page 38: Test Driven Development

38

還記得嗎?小明是有為上進的好青年

所以小明繼續尋找開發時測試案例能和顧客溝通無障礙的方法

Page 39: Test Driven Development

39

皇天不負苦心人,小明找到了

行為驅動開發!(Behavior Driven Development、 BDD)

Page 40: Test Driven Development

40

• 與專案有關的利益相關者密切合作• 使用同一種語言溝通 (人話 )• 使用可自動執行的範例描述系統行為• 將人話自動轉成測試程式─人話與測試程式自動繫結• 活的文件 (Living Document)─文件即需求&測試案例;且可直接從文件上得到開發進度和測試結果。

BDD如何解決問題?

• 可針對需求撰寫測試程式,但並沒有真的去釐清需求• 測試案例程式碼對 developer來說可以代表需求文件,但對

user來說是天書• 當需求異動時,測試程式難以同步異動

TDD的問題

小明眼中的 BDD解決的 TDD的一些問題

Page 41: Test Driven Development

41

• 用人話描述需求─ Gherkin 語法 :Feature: 用一個簡單的故事描述需求Scenario: 系統行為

Given – ArrangeWhen – ActThen – Assert

SampleFeature:

In order to 避免計算錯誤As a 數學白癡I want to 知道兩個數字相加的結果

Scenario: 兩個數字相加Given 在計算機輸入 50And 按下 + 按鈕And 在計算機輸入 70When 按下計算Then 結果應該為 120

在 BDD中,用人話搭配 Gherkin 語法描述需求規格

Page 42: Test Driven Development

42

動態、不斷修改和更新的文件 避免逆向工程:從程式邏輯反推業務邏輯是很困難的 (說不定程式邏輯其實還是錯的 )

將文件、業務邏輯、程式邏輯綁在一起當需求異動時可以同時更新可以用來追蹤開發進度其他…

這些需求規格,可以變成活的文件 (Living Document)

Page 43: Test Driven Development

43

小明學到 BDD的開發流程

需求

專案關係人共同討論,說人話並由實例、雛形產生需求文件

由文件產生測試程式 TDD開發 產生

活的文件

Page 44: Test Driven Development

44

雖然 BDD有許多好處,但是小明也發現…專案關係人常常都很忙,沒時間聚在一起討論要正確描述可實行的需求也是要溝通技巧的需要密切的配合,代表討論需求的成本也高

Page 45: Test Driven Development

45

由於 BDD進入成本相對較高,於是小明決定

用 BDD的精神和 TDD的流程進行系統開發

Page 46: Test Driven Development

46

當需求出現時,小明釐清需求並用人話描述需求與規格可能的話盡量多與專案關係人確認需求將需求與測試程式自動繫結在一起針對需求產生的測試程式以 TDD的流程進行系統開發

Page 47: Test Driven Development

47

使用這樣的流程開發後,小明發現用人話溝通比用程式溝通輕鬆多了需求異動時改文件或改測試程式都更容易當功能開發完成,文件自動更新結果,更容易追蹤進度

Page 48: Test Driven Development

48

Demo一下…• 用人話完成需求規格• 需求與測試自動繫結• 測試結果自動更新到文件上• 透過 CI,在每次簽入程式碼時執行測試並更新文件

Page 49: Test Driven Development

49

到目前為止,小明的經驗Unit Test: 確保程式跑起來跟想的一樣TDD: 先想清楚系統如何運作再寫程式BDD: 用人話描述需求,將需求與測試繫結, 減少認知差異TDD/BDD的重點是開發!測試只是順便帶著測試的心態學 TDD會覺得層層阻礙帶著開發的心態學 TDD 便能了解其中美妙將問題拆解成小問題,再一個個解決,開發會更順暢

Page 50: Test Driven Development

50

小明很開心!

Page 51: Test Driven Development

小明還在持續學習中

Page 52: Test Driven Development

以後是否會學到新的方法?

Page 53: Test Driven Development

那又是另外一個故事了…The End

Page 54: Test Driven Development

補充:關於 UI的自動化測試這裡講的不是開發,是測試

Page 55: Test Driven Development

55

問題• 這樣的畫面你要怎麼測?

Page 56: Test Driven Development

56

問題• 手動測試的問題

N個欄位要手動輸入 每次測試資料不能打錯 一點點小修改就要重新測試一次 需求異動時改程式 10分鐘,但測試要多久?

Page 57: Test Driven Development

57

自動化測試 Web測試─ Selenium

FireFox外掛 可錄製操作行為 可轉成 C#測試程式

WinForm測試 UI Automation

官方產品 https://msdn.microsoft.com/en-us/library/dd286726.

aspx White

https://github.com/TestStack/White

自動化測試 自動化執行的測試腳本 做一次,用很多次 腳本跑完可以自動驗證結果是否正確

Page 58: Test Driven Development

補充 : 測試框架

Page 60: Test Driven Development

Q&A