bdd in .net
DESCRIPTION
主題:BDD in .NET - TDD 在實務上的最後一塊拼圖 摘要描述: TDD 的概念不難,難的是在各個角色之間如何達成共識。 TDD 的技巧不難,難的是怎麼寫出既符合使用者需求,又可以幫助開發人員 TDD 的測試案例。 這次將介紹在實務開發流程中,如何透過 BDD 來滿足使用者、測試人員與開發人員,如何透過 BDD 來產生既符合使用者需求,且大家都看的懂,還可以轉換成測試程式的測試案例。TRANSCRIPT
![Page 1: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/1.jpg)
Joey Chen @ 2013 WebConf
2013/01/12
BDD in .NET -
TDD 在實務上的最後一塊拼圖
1
![Page 2: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/2.jpg)
Joey Chen (91)
Microsoft ASP.NET MVP 2010~2013
C#
Agile, Scrum, XP
Testing
2
![Page 3: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/3.jpg)
您試過嗎?
•Unit Test
•TDD
•Scrum
3
![Page 4: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/4.jpg)
常見 TDD 學習過程
Refactoring • 更好維護
Unit Testing • 學寫測試
Test-Driven • 先寫測試
4
![Page 5: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/5.jpg)
測試程式誰不會寫
5
![Page 6: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/6.jpg)
測試程式誰不會寫
6
![Page 7: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/7.jpg)
正常一點的測試程式
怎麼來的
7
![Page 8: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/8.jpg)
正常一點的測試程式
怎麼來的
8
![Page 9: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/9.jpg)
程式不是寫給自己爽的
要能滿足使用者需求
9
![Page 10: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/10.jpg)
第一關
測試案例怎麼來
10
![Page 11: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/11.jpg)
User Requirement
User Story
Acceptance Test Cases
Integration Test Cases
Unit Test Cases
11
![Page 12: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/12.jpg)
1. User Requirement
網路ATM登入驗證
12
![Page 13: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/13.jpg)
2. User Story 我們需要一個登入驗證身份的功能:
In order to 驗證身份,避免非法使用者使用系統
As a 線上使用者
I want to 驗證使用者身份是否合法
-Why
-Who
-What
13
![Page 14: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/14.jpg)
3. Acceptance Test Cases
• 提款卡ID為1234,密碼為91,驗證
成功,導到index頁面
• 提款卡ID為1234,密碼為1234,驗
證失敗,顯示密碼錯誤
14
![Page 15: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/15.jpg)
4. Integration Test Cases
• 呼叫Authentication的Verify方法,傳入id為
1234,password為91,回傳true
• 呼叫Authentication的Verify方法,傳入id為
1234,password為1234,回傳false
15
![Page 16: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/16.jpg)
5. Unit Test Cases
• 呼叫Authentication的Verify方法
• 傳入id為1234,password為91
• 模擬ICardDao回傳abc
• 模擬IHash回傳abc
• 回傳true
16
![Page 17: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/17.jpg)
另一個問題
17
![Page 18: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/18.jpg)
User Requirement
User Story
Acceptance Test Cases
Integration Test Cases
Unit Test Cases
PO, user, QA
Developer
18
![Page 19: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/19.jpg)
19
![Page 20: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/20.jpg)
程式不是給人看的
20
![Page 21: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/21.jpg)
程式不是給人看的
?! PO
QA user
21
![Page 22: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/22.jpg)
• 提款卡ID為1234,密碼為91,驗證成功,導到index頁面
• 提款卡ID為1234,密碼為1234,驗證失敗,顯示密碼錯誤
• 呼叫Authentication的Verify方法,傳入id為1234,
password為91,回傳true
• 呼叫Authentication的Verify方法,傳入id為1234,
password為1234,回傳false
RD
22
![Page 23: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/23.jpg)
• 提款卡ID為1234,密碼為91,驗證成功,導到index頁面
• 提款卡ID為1234,密碼為1234,驗證失敗,顯示密碼錯誤
• 呼叫Authentication的Verify方法,傳入id為1234,
password為91,回傳true
• 呼叫Authentication的Verify方法,傳入id為1234,
password為1234,回傳false 用說的比較快!
RD
23
![Page 24: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/24.jpg)
第二關
溝通基準如何一致,降低轉換成本
24
![Page 25: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/25.jpg)
Domain Specific Language
Behavior-Driven Development
25
![Page 26: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/26.jpg)
What is BDD
• 從行為面用人話描述系統功能
• 從人話自動產生程式執行流程
• User Story與測試程式的橋樑
26
![Page 27: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/27.jpg)
Why BDD
• 都用人話溝通
• 人話可轉換成程式
• 滿足使用者需求
27
![Page 28: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/28.jpg)
哪個好懂
28
![Page 29: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/29.jpg)
測試程式
只有現在的自己看得懂
29
![Page 30: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/30.jpg)
Scenario
30
![Page 31: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/31.jpg)
• C#
• SpecFlow
How BDD Works
31
![Page 32: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/32.jpg)
User Story
Feature 32
![Page 33: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/33.jpg)
User Story
Acceptance Test Cases
33
![Page 34: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/34.jpg)
Feature
Scenarios 34
![Page 35: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/35.jpg)
Acceptance Test Case
Scenario
35
![Page 36: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/36.jpg)
Scenario
Given When Then
Arrange Act Assert
36
![Page 37: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/37.jpg)
Feature
Scenario
Test Code
37
![Page 38: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/38.jpg)
開發流程
38
![Page 39: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/39.jpg)
39
![Page 40: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/40.jpg)
40
![Page 41: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/41.jpg)
41
![Page 42: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/42.jpg)
42
![Page 43: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/43.jpg)
43
![Page 44: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/44.jpg)
44
![Page 45: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/45.jpg)
45
![Page 46: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/46.jpg)
46
![Page 47: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/47.jpg)
47
![Page 48: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/48.jpg)
48
![Page 49: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/49.jpg)
49
![Page 50: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/50.jpg)
50
![Page 51: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/51.jpg)
From: http://arithmandar.blogspot.tw/2009/08/v-model.html
V - model by BDD
51
![Page 52: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/52.jpg)
ATDD, BDD, TDD
52
![Page 53: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/53.jpg)
ATDD, BDD, TDD
No Bottom-Up !
Top-Down !
53
![Page 54: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/54.jpg)
Production code
Testing code Test case User story User
requirement
滿足使用者需求
54
![Page 55: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/55.jpg)
Demo
•Acceptance Testing: Selenium WebDriver
•Unit Testing: MS Test
•Mock/Stub: Rhino.Mocks
55
![Page 56: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/56.jpg)
主要步驟
由user story撰寫feature
由acceptance test cases撰寫scenarios
建立雛形網站
錄製selenium腳本
將selenium腳本匯出成C#程式
將selenium的C#程式放到scenario的steps中
完成acceptance testing code – 紅燈
撰寫production code,通過測試 – 綠燈
重構
56
![Page 57: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/57.jpg)
• 用人話來說明需求
• 用人話來描述測試案例
• 用人話來寫程式
結論
57
![Page 58: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/58.jpg)
目標明確
58
![Page 59: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/59.jpg)
貫穿全場
59
![Page 60: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/60.jpg)
保持節奏
60
![Page 61: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/61.jpg)
感想
用說的真的比較快!
RD
61
![Page 62: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/62.jpg)
記住!
程式碼不是寫給自己爽的
要滿足使用者需求
62
![Page 63: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/63.jpg)
補充 – SpecFlow 特色
•依據不同 testing framework 產生測試程式框架
•可於 Scenario 上偵錯
•支援 table layout 與取得強型別物件
•支援註冊型別,取得物件 ( IoC framework )
•支援 attribute hook event ( AOP )
63
![Page 64: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/64.jpg)
參考資料
The Art of Unit Testing: With Examples in .Net
Test Driven: TDD and Acceptance TDD for Java Developers
Growing Object-Oriented Software, Guided by Tests
Emergent Design: The Evolutionary Nature of Professional Software
Development
Brownfield Application Development in .Net
Scrum and XP from the Trenches (Enterprise Software Development)
30 天快速上手 TDD (by 91)
SpecFlow 官網
64
![Page 65: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/65.jpg)
65
![Page 66: BDD in .NET](https://reader036.vdocuments.mx/reader036/viewer/2022081715/5482680bb4af9faf0d8b477f/html5/thumbnails/66.jpg)
問題與討論
Thanks for your listening
66