2014-02-21 81 views
2

我有的場景是從卡組中抽取指定數量的卡片並按排序順序(首先是西裝,然後是面值)返回它們。使用Assert的單元測試案例

<param name="howMany">how many cards to draw. 
<returns>a list of drawn cards, sorted by suit and face value (rank)</returns> 

我已經編寫了這個方法來實現它。我必須爲它寫一個單元測試代碼。有什麼可能的單元測試,因爲它有一個列表來比較和如何實現。

public List<Card> DrawSorted(int howMany) 
{ 
    List<Card> drawnCards = _cards.Take(howMany).ToList(); 
    IEnumerable<Card> sortedCards = from card in drawnCards 
              orderby card.Order ascending 
              select card; 
    return sortedCards.ToList(); 
} 

任何幫助深表感謝

回答

2

你應該讓測試儘可能的簡單,並應可能使一些測試在這裏:

一些粗略的想法:

  • 一個驗證你畫和返回的卡
  • 正確的號碼
  • 一個檢查如果您繪製的卡片按照正確的順序開始,您仍然可以按照正確的順序將它們取回
  • 一個用於檢查卡片是否以正確順序返回正確或DER。

一個簡單的方法來檢查排序是通過只畫一小塊卡片(甚至可能只是兩個?),並比較它們;這將使您儘可能簡化測試邏輯,同時在出現問題時仍能夠發出警告。

當然更好的過程會一直到指定的測試形式最簡單的要求開始,然後做一點他們更先進位,同時加入的邏輯來你的方法,你去。那麼你可能測試命名爲這樣的事情(你可能已經猜到,他們可能包含的內容):

public void should_return_correct_nr_of_cards(){ ... } 

public void should_return_presorted_cards_in_correct_order(){ ... } 

public void should_return_unsorted_cards_sorted(){ ... } 
+0

其實這不是一個問題,有牌的排序甲板上,然後用第N卡從這個分類結果進行比較甲板。我也會重命名這個方法,因爲它不會*畫*卡。我會添加測試以驗證不正確的* howMany *值的行爲(零,小於零,然後是套牌大小) –

+0

好點。雖然方法名稱沒有說明它正在測試繪圖,但嚴格來說,我現在仍然重命名它,使其更簡單一些,不太可能被誤解。這是一個開始;我想你可以添加更多的測試,例如去測試各種潛在的錯誤,但我也不想過度。你不應該覺得你_absolutely有to_測試每一種可能的不測事件 - 剛剛夠,你可以感受到有理由相信你的代碼。 – Kjartan

1

你要問的第一個問題就是「我想要什麼測試?」。你測試所有的牌是不同的?您是否測試了繪製更多卡時發生的情況?我自己我會測試(和其他一些邊緣情況下)。

你必須做的第二件事是提供一些機制來嘲笑要繪製的卡片列表。對於一個有價值的測試,你需要能夠設定每次測試的條件。

我的建議是創建測試類,像這樣:

public class Deck 
{ 
    private List<Card> _cards; 

    public Deck(List<Card> allCards) 
    { 
    _cards = allCards; 
    } 

    public List<Card> DrawSorted(int howMany) 
    { 
    List<Card> drawnCards = _cards.Take(howMany).ToList(); 
    IEnumerable<Card> sortedCards = from card in drawnCards 
              orderby card.Order ascending 
              select card; 
    return sortedCards.ToList(); 
    } 
} 

在您的測試類,你可以在你想用你的測試卡的完整列表通過。

根據您使用的測試框架,測試本身會稍有不同。但這裏有一個例子:

[Test] 
public void CheckCorrectNumberOfCardsAreReturned() 
{ 
    List<Card> allCards = GenerateDeck(); 
    var deck = new Deck(allCards); 
    var drawnCards = deck.DrawSorted(5); 
    Assert.AreEqual(5, drawnCards.Count()); 
} 

對於您的測試是真正有價值的,如果你嘗試和借鑑55卡會發生什麼?你應該得到55或52(假設一副標準牌)?

如果我在我的所有卡片中有重複的內容,當我繪製它們或應該刪除某些內容時,是否應該得到重複的內容?

測試與需求直接掛鉤 - 弄清楚你的方法應該做什麼並設計你的測試以確保你的代碼符合要求

一對夫婦最後的點:

  • 一個測試應該測試一個邊緣情況/件的行爲,這往往會導致每個方法的多個測試
  • 測試應該知道初始條件(可以配置你的卡組給予你想要的測試條件)
  • 一個測試應該是可重複的,對諸如隨機數的事情要小心。從兩個牌組中抽出一張隨機牌並檢查他們是不是一樣? 1/52他們可能是!這些測試是診斷的噩夢。
1

我希望這有助於!

我認爲一個可能的單元測試是檢查結果是否已在調用DrawSorted後排序。

我會創建其他方法稱爲IsSorted,返回一個布爾值,然後使用此方法來測試輸出。

喜歡的東西:

bool expectedAnswer = true; 

List<Cards> list = yourClass.DrawSorted(15); 
bool result = yourClass.IsSorted(list); 

Assert.AreEqual(expectedResult, result); 

或者是這樣的。