我正在为自己在一个小型项目工作,我正在使用它作为一个机会了解单元测试和维护正确的文档.
我有一个甲板课程,代表一张卡片(这非常简单,老实说,我可以确定它没有单元测试,但是像我说我习惯使用单元测试),它有一种改变甲板上卡片顺序的洗牌()方法.
实施非常简单,一定会奏效:
public void shuffle() { Collections.shuffle(this.cards); }
但是,如何才能实现这种方法的单元测试.我的第一个想法是检查一下,在调用shuffle()之后,甲板上的顶卡是不同的,但是当然有可能是一样的.我的第二个想法是检查整个卡的顺序是否已经改变了,但是它们可能也是一样的.那么,我怎么能写一个测试,确保这种方法在所有情况下工作?而且,一般来说,你如何单位测试结果取决于一些随机性的方法?
干杯,
皮特
解决方法
断言您的洗牌方法是否实际洗牌是非常困难的,如果不是不可能的话.默认随机数生成器在一定程度上是随机的.测试你是否对这种随机性感到满意是不可能的,因为它需要太多的时间.你实际测试的是随机数发生器本身没有什么意义.
可以测试的是这个方法的invariants.
>如果您退出该方法,则甲板上应该有与您输入的牌数完全相同的牌.
>洗牌方法不应该引入重复.
你当然可以创建一个测试,检查在n个洗牌的顺序没有重复的甲板返回.但是有一段时间,这个测试可能会失败(不过不太可能,如其他答案中已经说过的).
需要考虑的其他事项是随机数发生器本身.如果这只是一个玩具项目,java.util.Random就足够了.如果您打算创建一些在线卡片游戏,请考虑使用java.security.SecureRandom.