2011-03-13 47 views
0

一個功能,而下面的測試驅動的開發,我遇到了,我需要寫一個類似如下的功能:TDD過程與多個執行路徑

public MyClass DoSomething(string value) 
{ 
    SomeClass existCheck = repository.Get(value); 

    if(existCheck == null) 
     throw new InvalidOperationException("SomeClass must exist to do something"); 

    if(existCheck.MyClass != null) 
     return existCheck.MyClass; 

    MyClass myClass = new MyClass() 
    { 
     // create object 
    }; 

    return myClass; 
} 

使用TDD的,我會需要編寫單獨的測試,以

  1. 斷言,拋出異常
  2. 斷言,現有SomeClass返回
  3. 斷言新MyClass返回

如何撰寫all三個測試第一,然後對其進行編碼,還是我寫的每一個測試,然後代碼測試所需的功能的功能來傳遞,然後寫入下一個測試和代碼功能等?

回答

4

我一直認爲,使用TDD時,您應該採用嬰兒的步驟,採用紅光綠燈方法。我會繼續在以下步驟:

  1. 寫出existCheck == NULL場景的測試,這將失敗(紅燈)
  2. 做方案1必要的工作取得成功,並重新運行測試(綠燈)
  3. 爲existCheck.MyClass!= null方案編寫第二個測試,這將失敗。你通常可以通過複製你的第一個測試並修改它來做到這一點。
  4. 修改該方法以使測試1和2都通過。
  5. 對最終執行路徑重複步驟3和4。

通常情況下,我發現隨着方法的進行,您可以進行測試,然後在每次到達分支時複製測試,根據不同的路徑定製每個測試。

+0

我剛剛注意到有一個類似的問題。請參閱[鏈接](http://stackoverflow.com/questions/1174906/tdd-one-test-at-a-time-or-make-a-batch) – RichTea 2011-03-13 20:21:09

2

爲每個預期行爲編寫一個單獨的測試。

一個很好的經驗法則是每個測試通常應該包含一個斷言。

編輯 - 回答這個實際上是問的問題...

TDD的過程是編寫每個測試,讓它通過,然後重構你做了什麼。只有在完成之後,才能着手編寫下一個測試。從技術上講,你可以預先寫出其他測試,但將它們註釋掉,所以就好像它們還沒有寫出來一樣。儘管在未來的測試中花費很少的時間,因爲你可能會發現它們是錯誤的測試,基於你做了第一個測試,然後重構你以後做的測試。

+0

這就是我想要做的,我的問題是我編寫第一個測試,然後編寫功能以使其通過,然後編寫第二個測試,然後編寫功能或編寫全部三個測試,然後編寫功能爲他們所有?更新我的問題。 – Omar 2011-03-13 20:12:54

+0

對不起 - 沒有仔細閱讀。 – 2011-03-13 20:18:13

2

TDD的基本工作流程是紅/綠/重構

  1. 首先編寫測試程序,它應該會失敗(紅色)。

  2. 寫出儘可能少的生產代碼(儘可能簡單)以使測試通過(綠色)。

  3. 重構保留綠色狀態的生產代碼。

如果發現不是一切都還沒有實現,從點1開始。所以你的情況 - 你可能要麼先寫所有的測試,然後實現一切第一個分支寫入測試,使它通過寫入第一個條件爲綠色,爲第二個分支寫入測試,使其通過,等等。

在我看來,在啓動實際代碼之前有一個完整的問題描述(完整測試套件),而不是切換回從測試到生產代碼。

0

這取決於你的攻角。如果你已經掌握了整個班級的模式 - 並且你的問題提出了這個問題 - 那麼你寫下所有的測試。如果您的代碼以更小的步驟演變,那麼您當時就會進行測試。 TDD的關鍵是首先編寫測試。