2012-03-10 48 views
1

我有一个叫做shuffle的方法,就像我在下面显示的方法那样,洗牌一个ArrayList,整数。我想知道,我必须测试这种方法吗?洗牌整数测试的方法

public void shuffle(){ 
    Collections.shuffle(numbers); 
    } 

我使用这种方法来洗牌的52张扑克牌,在这种情况下,这是一种很难看到(通过,如果卡洗牌或不测试,因为你可能有两张牌用相同号码或同一花色,它仍然被认为洗牌一行。

+1

尝试产生一个随机种子..并应用于'Collections.shuffle'方法...类似于:'long seed = System.nanoTime(); Collections.shuffle(numbers,new Random(seed));' – 2012-03-10 16:14:43

+1

在什么情况下?如果只有你会使用或编辑这个方法,我会测试Collections.shuffle(数字)是否符合你的期望。如果其他人可能在将来编辑这种方法,它可能*值得写一个单元测试,以防他们决定改变你的实现,但不理解/知道需求。您可以测试边缘案例,例如,当给定包含重复项的数字时,随机播放会执行什么操作,或者当给定不支持设置操作的集合时,随机播放会执行什么操作。 – 2012-03-10 16:17:37

+0

@ user1181847:通常默认的混洗算法不足以防止攻击。在那些日子里,至少有一个在线扑克网站的洗牌算法是由海盗制定的,然后他们继续击败其他玩家。现在大多数在线扑克网站都使用非常先进的洗牌方法,其中一些甚至可以使用提供“真正”随机来源的物理设备。为了防止攻击,你至少需要一个密码安全的伪随机数发生器(CSPRNG)。 * Collections.shuffle()*不适合涉及真钱的情况(例如在线扑克网站) – TacticalCoder 2012-03-10 16:42:52

回答

3

仍处于测试琐碎程序的一个点。可以测试

  • 个其委托给Collections.shuffle如果这是的日常
  • 要求它实际上打乱

这将让你知道,常规仍然秉持其合同,你应该希望refactor以后。

需要来测试它吗?不是实用要测试吗?也许不是。但是,每一点保证都有助于验证程序的正确性。最终,这是由你来决定的。


编辑 这是很好的做法,以测试其设计。本质上,它更容易测试不具有副作用例程,即,

作用在其输入端的例程,计算出的值,并返回结果。

现在由于Collections.shuffle修改现有列表返回值似乎不明确。让我们考虑的第二个最好的选择可测性

public void shuffle(List<?> l) { 
    Collections.shuffle(l); 
} 

无论这样的设计是适合或不情况下,我离开你的判断。这只是一般fyi :)