具有随机性的JUnit测试方法

10 java random junit unit-testing

我现在正在为自己开展一个小项目,我正在利用它作为一个了解单元测试和维护适当文档的机会.

我有一个Deck代表一副牌的课(这很简单,说实话,我可以肯定它没有单元测试,但就像我说我已经习惯了使用单元测试)它有一个shuffle() 改变卡片中卡片顺序的方法.

实现非常简单,肯定会起作用:

public void shuffle()
{
    Collections.shuffle(this.cards);
}
Run Code Online (Sandbox Code Playgroud)

但是,我怎么能为这个方法实现单元测试.我的第一个想法是在通话后检查牌组的顶牌是否有所不同,shuffle()但当然有可能是相同的.我的第二个想法是检查整个卡的顺序是否已经改变,但它们可能也是相同的顺序.那么,我怎么能编写一个测试来确保这种方法适用于所有情况呢?而且,一般来说,如何对结果取决于某些随机性的单元测试方法进行单元化?

干杯,

皮特

Ron*_*erg 5

如果不是不可能的话,断言你的随机播放方法是否真的洗牌.默认随机数生成器只是随机到一定程度.测试你是否对这种随机性感到满意是不可能的,因为这需要花费太多时间.您实际测试的是随机数生成器本身,它没有多大意义.

但是你可以测试的是这种方法的不变量.

  • 如果您退出该方法,则卡片中的卡片数量应与您输入时相同.
  • shuffle方法不应该引入重复.

您当然可以创建一个测试,检查在一系列nshuffle中是否没有返回重复的deck.但偶尔这个测试可能会失败(但不太可能,正如其他答案中已经说过的那样).

要考虑的其他因素是随机数生成器本身.如果这只是一个玩具项目,java.util.Random就足够了.如果您打算创建一些在线纸牌游戏,请考虑使用java.security.SecureRandom.