bdd in .net

66
Joey Chen @ 2013 WebConf 2013/01/12 BDD in .NET - TDD 在實務上的最後一塊拼圖 1

Upload: joey-chen

Post on 05-Dec-2014

5.035 views

Category:

Documents


0 download

DESCRIPTION

主題:BDD in .NET - TDD 在實務上的最後一塊拼圖 摘要描述: TDD 的概念不難,難的是在各個角色之間如何達成共識。 TDD 的技巧不難,難的是怎麼寫出既符合使用者需求,又可以幫助開發人員 TDD 的測試案例。 這次將介紹在實務開發流程中,如何透過 BDD 來滿足使用者、測試人員與開發人員,如何透過 BDD 來產生既符合使用者需求,且大家都看的懂,還可以轉換成測試程式的測試案例。

TRANSCRIPT

Page 1: BDD in .NET

Joey Chen @ 2013 WebConf

2013/01/12

BDD in .NET -

TDD 在實務上的最後一塊拼圖

1

Page 2: BDD in .NET

Joey Chen (91)

Microsoft ASP.NET MVP 2010~2013

C#

Agile, Scrum, XP

Testing

2

Page 3: BDD in .NET

您試過嗎?

•Unit Test

•TDD

•Scrum

3

Page 4: BDD in .NET

常見 TDD 學習過程

Refactoring • 更好維護

Unit Testing • 學寫測試

Test-Driven • 先寫測試

4

Page 5: BDD in .NET

測試程式誰不會寫

5

Page 6: BDD in .NET

測試程式誰不會寫

6

Page 7: BDD in .NET

正常一點的測試程式

怎麼來的

7

Page 8: BDD in .NET

正常一點的測試程式

怎麼來的

8

Page 9: BDD in .NET

程式不是寫給自己爽的

要能滿足使用者需求

9

Page 10: BDD in .NET

第一關

測試案例怎麼來

10

Page 11: BDD in .NET

User Requirement

User Story

Acceptance Test Cases

Integration Test Cases

Unit Test Cases

11

Page 12: BDD in .NET

1. User Requirement

網路ATM登入驗證

12

Page 13: BDD in .NET

2. User Story 我們需要一個登入驗證身份的功能:

In order to 驗證身份,避免非法使用者使用系統

As a 線上使用者

I want to 驗證使用者身份是否合法

-Why

-Who

-What

13

Page 14: BDD in .NET

3. Acceptance Test Cases

• 提款卡ID為1234,密碼為91,驗證

成功,導到index頁面

• 提款卡ID為1234,密碼為1234,驗

證失敗,顯示密碼錯誤

14

Page 15: BDD in .NET

4. Integration Test Cases

• 呼叫Authentication的Verify方法,傳入id為

1234,password為91,回傳true

• 呼叫Authentication的Verify方法,傳入id為

1234,password為1234,回傳false

15

Page 16: BDD in .NET

5. Unit Test Cases

• 呼叫Authentication的Verify方法

• 傳入id為1234,password為91

• 模擬ICardDao回傳abc

• 模擬IHash回傳abc

• 回傳true

16

Page 17: BDD in .NET

另一個問題

17

Page 18: BDD in .NET

User Requirement

User Story

Acceptance Test Cases

Integration Test Cases

Unit Test Cases

PO, user, QA

Developer

18

Page 19: BDD in .NET

19

Page 20: BDD in .NET

程式不是給人看的

20

Page 21: BDD in .NET

程式不是給人看的

?! PO

QA user

21

Page 22: BDD in .NET

• 提款卡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

• 提款卡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

第二關

溝通基準如何一致,降低轉換成本

24

Page 25: BDD in .NET

Domain Specific Language

Behavior-Driven Development

25

Page 26: BDD in .NET

What is BDD

• 從行為面用人話描述系統功能

• 從人話自動產生程式執行流程

• User Story與測試程式的橋樑

26

Page 27: BDD in .NET

Why BDD

• 都用人話溝通

• 人話可轉換成程式

• 滿足使用者需求

27

Page 28: BDD in .NET

哪個好懂

28

Page 29: BDD in .NET

測試程式

只有現在的自己看得懂

29

Page 30: BDD in .NET

Scenario

30

Page 31: BDD in .NET

• C#

• SpecFlow

How BDD Works

31

Page 32: BDD in .NET

User Story

Feature 32

Page 33: BDD in .NET

User Story

Acceptance Test Cases

33

Page 34: BDD in .NET

Feature

Scenarios 34

Page 35: BDD in .NET

Acceptance Test Case

Scenario

35

Page 36: BDD in .NET

Scenario

Given When Then

Arrange Act Assert

36

Page 37: BDD in .NET

Feature

Scenario

Test Code

37

Page 38: BDD in .NET

開發流程

38

Page 39: BDD in .NET

39

Page 40: BDD in .NET

40

Page 41: BDD in .NET

41

Page 42: BDD in .NET

42

Page 43: BDD in .NET

43

Page 44: BDD in .NET

44

Page 45: BDD in .NET

45

Page 46: BDD in .NET

46

Page 47: BDD in .NET

47

Page 48: BDD in .NET

48

Page 49: BDD in .NET

49

Page 50: BDD in .NET

50

Page 52: BDD in .NET

ATDD, BDD, TDD

52

Page 53: BDD in .NET

ATDD, BDD, TDD

No Bottom-Up !

Top-Down !

53

Page 54: BDD in .NET

Production code

Testing code Test case User story User

requirement

滿足使用者需求

54

Page 55: BDD in .NET

Demo

•Acceptance Testing: Selenium WebDriver

•Unit Testing: MS Test

•Mock/Stub: Rhino.Mocks

55

Page 56: BDD in .NET

主要步驟

由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

• 用人話來說明需求

• 用人話來描述測試案例

• 用人話來寫程式

結論

57

Page 58: BDD in .NET

目標明確

58

Page 59: BDD in .NET

貫穿全場

59

Page 60: BDD in .NET

保持節奏

60

Page 61: BDD in .NET

感想

用說的真的比較快!

RD

61

Page 62: BDD in .NET

記住!

程式碼不是寫給自己爽的

要滿足使用者需求

62

Page 63: BDD in .NET

補充 – SpecFlow 特色

•依據不同 testing framework 產生測試程式框架

•可於 Scenario 上偵錯

•支援 table layout 與取得強型別物件

•支援註冊型別,取得物件 ( IoC framework )

•支援 attribute hook event ( AOP )

63

Page 64: BDD in .NET

參考資料

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

65

Page 66: BDD in .NET

問題與討論

Thanks for your listening

66