使用Assert的单元测试用例

时间:2014-02-21 07:28:08

标签: c# unit-testing

我的场景是从牌组中抽出指定数量的牌并按排序顺序返回(首先是套装,然后是面值)。

<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();
}

非常感谢任何帮助

3 个答案:

答案 0 :(得分:2)

你应该尽可能简单地进行测试,并且应该在这里做几个测试:

一些粗略的想法:

  • 一个用于验证您是否绘制并返回正确数量的卡片
  • 要检查一下你是否知道你知道的卡片的开头顺序是正确的,你仍然可以按正确的顺序取回它们
  • 检查不正确顺序的卡片是否按正确顺序退回。

检查订购的一种简单方法是只画一小张卡片(甚至可能只是两张?),然后比较一下;这将使您尽可能地保持测试逻辑的简短和简单,同时仍然能够在出现问题时发出警告。

当然,更好的过程是以开始时的测试形式指定最简单的需求,然后逐步使它们更高级,同时为您的方法添加逻辑。然后你可能会有类似这样的测试(你可能猜到它们可能包含的内容):

public void should_return_correct_nr_of_cards(){ ... }

public void should_return_presorted_cards_in_correct_order(){ ... }

public void should_return_unsorted_cards_sorted(){ ... }

答案 1 :(得分: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(假设一副标准牌)?

如果我的allCards中有重复项,我是否应该在绘制它们时重复,或者应该删除一些重复项?

测试直接与需求相关联 - 确定您的方法应该做什么,并设计测试以确保您的代码符合要求

最后几点:

  • 一个测试应测试一个边缘情况/一个行为,这通常导致每个方法多次测试
  • 测试应该具有已知的启动条件(您可以配置您的卡座以提供您想要的测试条件)
  • 测试应该是可重复的,要警惕随机数字之类的东西。从两个牌组中抽出一张随机牌并检查它们是不一样的? 1/52他们可能!这类测试是诊断的噩梦。

答案 2 :(得分:1)

我希望这有帮助!

我认为一个可能的单元测试是在调用DrawSorted后检查结果是否已经排序。

我会创建一个名为IsSorted的其他方法,返回一个bool,然后使用此方法测试输出。

类似的东西:

bool expectedAnswer = true;

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

Assert.AreEqual(expectedResult, result);

或类似的东西。