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

标签 java random junit

<分区>

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

使用随机数的库示例是 java.util.Collections.shuffle(List<?> list)http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle 之后打乱一组对象.

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

最佳答案

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

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

单元测试应该是确定性的。一遍又一遍地重新运行相同的测试应该每次都会产生相同的结果。如果他们不这样做并且测试失败,那么失败是因为代码有问题还是因为非确定性输出产生了无效输入?如果在重新运行结果时测试通过,是因为错误已修复还是因为我们碰巧获得了有效的随机输入?

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

这样,所有测试每次都会针对相同的输入产生相同的输出,并且您可以从不同的结果中获益。

编辑 您似乎真的想测试自己的随机数生成器。

这里是描述统计测试的链接,您应该执行这些测试以查看它是否真的是随机的(或至少尽可能随机)

RANDOM.ORG statistical analysis

NIST statistical test suite

关于java - 如何为随机输出编写 jUnit 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24420209/

相关文章:

Java servlet 处理应用程序/八位字节流用于图像上传

java - 如何从 Ubuntu 中正确卸载 Interactive Brokers 的 TWS(交易者工作站)?

android - 无法使用 Robolectric 编译测试

java - 进行 JUnit 测试时在 JSF 中找不到组件 ID

java - 使用多个 if 语句进行 Junit 测试

java - libGDX : Scrollpane is child of Scrollpane and switch between them in scrolling

java - Spring 3中静态内容的自动刷新

haskell - 如何在计算随机值的 haskell 程序中构造 monad?

python-3.x - 如何在并行化随机种子实验时确保可重复性?

regex - perl生成字符串来匹配正则表达式