EZTABLE IDEAS 是 EZTABLE 成員揮灑熱情和大家分享專業及創意的網誌。 EZTABLE 讓消費者 24 小時都可以在網路訂位全台灣最優質的餐廳,同時提供餐廳經營者 e 化的訂位管理系統 (雲端、iPad、智慧型手機)

【Workshop】TDD: Spies, Stubs, and Mocks

八月 15 2014 Published by under Engineering

 【Workshop@140808】

Topic: TDD: Spies, Stubs, and Mocks
Speaker: Hao-Kang 
slideshare: TDD: Spies, Stubs, and Mocks

 

 

繼之前 Andy 在 Workshop 中介紹何謂 TDD,我們了解到為何要做 TDD 的原因以及 TDD 上手的三原則!(詳情請見:《TDD介紹》)

今日有請 HaoKang 繼續為TDD這個主題做延伸介紹,

什麼是 Spies, Stubs, and Mocks ? 讓我們看下去。

3-IMG_1989

 

 

投影片1

  • test spy 是什麼?

  • stubs 是什麼?

  • mocks 是什麼?

  • mocks 使用時機?

  • 何時不該使用 mocks?

 

 

 

 

test spy 是什麼?

投影片2

  •  spy 簡單來講它是一個 function,它會記錄被呼叫的時候的參數、回傳值,用來確認該物件如何被使用。

 

 

stubs 是什麼?

投影片3

  • stub 可以去監聽別人的 methods,而且測試物件行為是否有如預期。

stub 基本上與 spy 相同,但它比 spy 強一點點,它有 pre-programmed behavior。

 

  • pre-programmed behavior: 你默默得到一個假的 server,並可以叫它做任何事情。

假設你使用的是網頁,用 address 去呼叫 API 並回傳值,因為是在寫 unit test,所以 API 回傳什麼內容我並不確定,如果今天 API 掛掉,unit test 便會fail。為了防止這個問題,我們 stub address 的 code,原本的 code 一行都不用改,直接用 stub 把它換掉,stub 可以做任何事情,例如收到某個 URL,就回傳這個data,有了 stub 等同於有假的server存在!

 

因此,在測試上有兩個好處: 
1. 你呼叫正確的 API,我回傳正確的值給你,你要有辦法正確的運作,所以我在裡面寫理想中的回傳值,你就得照這個理想值去測試。
2. 你呼叫錯誤,或是有任何問題server會回傳錯誤, 你要有辦法handle 這個 error。

 

 

 

 

mocks 是什麼?

投影片4

  •  mock 像是 spy+stub,它也有 pre-programmed behavior,但是它還有 pre-programmed expectations,當 expectations fail 時,你 test 便會 fail。

 

所以 pre-programmed expectations 是什麼意思呢?

mock opinion 很強烈,例如,假設我們預期 controller 需要呼叫 model,便 mock model 在裡面寫說如果它內容不一樣時,就fail。然後測試 controller, controller 給它一個 input,讓使用者輸入他的 email,理論上輸入完後應該要呼叫它的 model 更新它的 email,如果沒有這樣做,就犯了它的 test fail,直接 fail! 連討論都不用討論。

 

 

 mock 

看 code 範例,它在這邊  mock  我們的 API,同時在實際  run 之前,已先把它的 expectation 定義清楚,當這個 mock 不是這樣被呼叫的時候,它就直接顯示 error! 所以實際上我們在測試之前會把它要的結果先寫出來,強迫它這樣走,如果測試後不符合它要的要求,將會直接 fail!

 

 

 spy method

讓我們比較 spy method,
spy case 也是要 spy 某個 method,但它後面若要 assert,你可以選擇性的不 assert,如果你不 assert 你的 test case 就不會 fail,但 mock 不是,mock 根本沒有 assert 的這兩行,你若失敗將直接 fail,所以這是 mock 意見強大的地方,它要求你一定要這樣做!

 

順帶一提,spy 加 assert 後就如同 mock 一樣,不過你可以選擇性的加 assert;然後 assert 可以加入 if else 等的邏輯判斷,或是你可以偵測你的環境,如果環境有點不一樣,你可以選擇性的不執行。

  • 小結論: spy 比較靈活,mock 很硬

 

 

mocks 使用時機?

投影片5

  •  mock 只能用在測試上,在每個 unit test 裡最好只能存在一個!

不太懂意思,那往下看。

 

 

何時不該使用 mocks?

投影片6

  • 如果不確定實行的 detail,不要使用 mock。

mock 的 built-in expectations 很強烈,它會逼著你的 expectation detail 一定要照著它那樣走。
例如,你大致上寫了一個 unit test ,而 expectation 還不確定時你使用 mock,結果可能會是你正在調整內容,結果它一直 fail 你 fail 你 fail 你,直到要不你把它刪掉,要不想辦法符合它的 expectation。

 

  • 簡單的規則,如果你不想要那麼強烈的意見的話,就不要使用mock!

再次強調 mock 的意見非常非常的強! 如果你可以spy+assertion,就用spy+assertion 因為它比較flexible,或是你有 stub 就用 stub,沒事不要用mock。

 

  • 在一般狀況下,一個 test 裡不應該超過一個以上的mock,

  

 1-IMG_1987

 

 

總結

投影片7

以上是大概的介紹,大部分的內容在網路上找得到,
所以,要如何去找到你們要的答案,

1.  GOOGLE。
2. 看人家的 code。

將會有助於你對 TDD: Spies, Stubs, and Mocks  的了解。

 

最後,簡單的規則,

要 Spy、要 Assert、最後要測試你的假設,

我知道現在 call base 有很多各式各樣的問題,但不要妥協!

 

 

 2-IMG_1988

 

 

 

相關閱讀

 

 


 

如果您喜歡這篇文章可以點擊「讚」&「分享」
並歡迎訂閱EZTABLE IDEAS!  😀 

如果你是學習力強,而且經驗值高的人才,
歡迎一起加入我們 EZTABLE!! 

EZTABLE at Linkedin-Senior Mobile Software Engineer

 


Related Posts Plugin for WordPress, Blogger...

No responses yet

發表迴響