Java 如何为随机输出编写jUnit测试?

Java 如何为随机输出编写jUnit测试?,java,random,junit,Java,Random,Junit,与为具有部分随机性的代码编写测试相比,测试具有预定义输入和输出参数的代码相对容易,因为我们必须检查随机生成器是否有偏差 使用随机数的库的一个例子是java.util.Collections.shuffle(List List),它按照下面的命令洗牌对象集合 如何为具有随机输出的代码编写jUnit测试?不仅是为了洗牌,也为了测试一般的随机性。除非您正在编写一个实际的随机数生成器或某种依赖于安全随机数生成器的加密库,否则您不需要检查随机数生成器是否有偏差。这是随机数生成器的作者的工作 您的Colle

与为具有部分随机性的代码编写测试相比,测试具有预定义输入和输出参数的代码相对容易,因为我们必须检查随机生成器是否有偏差

使用随机数的库的一个例子是
java.util.Collections.shuffle(List List)
,它按照下面的命令洗牌对象集合


如何为具有随机输出的代码编写jUnit测试?不仅是为了洗牌,也为了测试一般的随机性。

除非您正在编写一个实际的随机数生成器或某种依赖于安全随机数生成器的加密库,否则您不需要检查随机数生成器是否有偏差。这是随机数生成器的作者的工作

您的
Collections.shuffle()
示例也是一个糟糕的示例,因为它是内置的JDK方法。没有理由测试内置的JDK方法,Java的作者已经为您以及在过去20年中使用这些方法的数百万用户完成了测试。您是否也有测试来确认
System.out.print()
也能正常工作

单元测试应该是确定性的。反复运行相同的测试每次都应该产生相同的结果。如果没有,测试失败,是因为代码有缺陷还是因为不确定的输出产生了无效的输入?如果在重新运行结果时,测试通过了,是因为错误被修复了,还是因为我们碰巧得到了有效的随机输入

出于这些原因,您的单元测试应该尝试模拟或剔除任何随机性。也许可以编写几个测试来执行数据的特定转换,以测试边界条件。例如,对于
shuffle()
,可能有一个按特定顺序对元素重新排序或按升序或降序对元素排序的测试,或者一个实际上不进行任何转换的测试等。这些都是可能随机发生的有效结果

这样,每次测试都会为相同的输入生成相同的输出,您可以从不同的结果中获益

编辑 看起来您实际上想要测试您自己的随机数生成器

这里有一些链接描述了你应该做的统计测试,看看它是否真的是随机的(或者至少是尽可能随机的)


stackoverflow.com/questions/56411/…是关于洗牌的。这是这个问题的一个子部分。@AlexandreSantos为什么这个问题的公认答案仍然适用?我猜输出有一定的值范围。那么,将输入的随机范围输入
n
次数,然后收集输出,看看每个输出是否具有相同的比率呢?如果比率相同,那么可以判断输出是随机的。我没有表示我想测试洗牌。我相信Sun/Oracle已经做到了这一点。我只是把它作为一个随机码的例子放在那里。然而,我可以使用另一个例子,比如在线游戏网站的随机数生成器。对于一个在线游戏网站来说,随机数生成器是真正随机的是很重要的。@AlexandreSantos添加了链接来实际测试RNGsI,他想知道同样的事情。我知道我的方法有效,因为我在应用程序的主界面中看到了结果。不过,我对Junit测试还不熟悉,我想知道如何确定是否使用Junit测试洗牌了一副牌。从你的回答来看,似乎没有可能的办法。对于有原始问题的人,我建议您使用main运行该方法并查看输出。这就是我检查洗牌牌牌的方式method@SedrickJefferson好吧,你可以一次又一次地洗牌,记下所有牌的位置。经过足够的次数后,您可以制作所有牌的直方图,以及它们被洗牌的位置。查看卡片是否均匀分布在牌组中的所有位置。确保每次洗牌时都以相同的顺序开始一副新牌。这不会测试随机数生成器是否安全且不可预测,但它至少会告诉您这些卡正在被洗牌