Java 为什么不使用伪随机数生成器生成测试数据?
本书第12.1章正确性测试,特别是第12.1.3小节测试安全(作者希望建立测试有界缓冲区类的数据竞争安全的测试用例) 为了确保您的测试实际上测试了您认为它所做的事情,它是 重要的是,校验和本身不能被 编译器。使用连续整数作为您的 测试数据,因为这样的结果总是一样的,而且很聪明 可以想象,编译器可以预先计算它 为了避免这个问题,测试数据应该随机生成,但是很多 否则,有效的测试会因随机选择不当而受损 数字发生器(RNG)。随机数生成可以创建耦合 在类和计时工件之间,因为大多数随机数 生成器类是线程安全的,因此引入了额外的 同步。为每个线程提供自己的RNG允许 使用非线程安全的RNG 我不理解作者反对使用随机数生成器生成测试输入的观点。具体来说,行随机数生成可以在类和计时工件之间创建耦合,我并不清楚Java 为什么不使用伪随机数生成器生成测试数据?,java,multithreading,random,concurrency,java.util.concurrent,Java,Multithreading,Random,Concurrency,Java.util.concurrent,本书第12.1章正确性测试,特别是第12.1.3小节测试安全(作者希望建立测试有界缓冲区类的数据竞争安全的测试用例) 为了确保您的测试实际上测试了您认为它所做的事情,它是 重要的是,校验和本身不能被 编译器。使用连续整数作为您的 测试数据,因为这样的结果总是一样的,而且很聪明 可以想象,编译器可以预先计算它 为了避免这个问题,测试数据应该随机生成,但是很多 否则,有效的测试会因随机选择不当而受损 数字发生器(RNG)。随机数生成可以创建耦合 在类和计时工件之间,因为大多数随机数 生成器类是线程安
Random
,可以看到它在封面下使用了一个AtomicInteger
,因此使用它将导致读写内存障碍,作为生成测试数据的一部分,这可能会改变其他线程查看数据的方式以及整个应用程序的计时
他在这里指的是哪些类和计时工件
任何使用线程并依赖内存同步的类都可能受到影响。基本上,它们调用的所有线程和类
RNG可以产生什么样的耦合 正如蜥蜴@Bill所评论的,这本书说,通过使用RNG,程序的计时依赖于或受RNG同步的影响 这里真正的教训是,如果可能的话,注入到程序中的测试数据不应该改变程序的计时。这通常是困难的,也可能是不可能的,但目标是在测试中尽可能多地模拟应用程序行为(计时、输入、输出等等)
就解决方案而言,您可以使用另一个未同步的解决方案。您还可以生成一个类,该类预先存储10000个随机数(或您需要的任意数),然后在不同步的情况下分发它们。但是,通过在测试中使用一个进行内存同步的类,您正在更改程序的计时。“RNG可以创建什么样的耦合?”由于测试代码中使用的RNG中的同步错误而导致测试失败的测试可能会通过。@BilltheLizard可能是您应该用注释编辑答案的最后一行吗+1注释。@Gray那么目标应该是尽可能地从测试数据中删除同步?否目标是注入程序的测试数据不应改变程序的计时。例如,如果您生成了一个事先得到10000个随机数的小类,那就可以了。但是,通过在测试中使用一个进行内存同步的类,您就改变了程序的计时@Geek@Gray,这是一个非常好的注释和非常好的答案。