Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不使用伪随机数生成器生成测试数据?_Java_Multithreading_Random_Concurrency_Java.util.concurrent - Fatal编程技术网

Java 为什么不使用伪随机数生成器生成测试数据?

Java 为什么不使用伪随机数生成器生成测试数据?,java,multithreading,random,concurrency,java.util.concurrent,Java,Multithreading,Random,Concurrency,Java.util.concurrent,本书第12.1章正确性测试,特别是第12.1.3小节测试安全(作者希望建立测试有界缓冲区类的数据竞争安全的测试用例) 为了确保您的测试实际上测试了您认为它所做的事情,它是 重要的是,校验和本身不能被 编译器。使用连续整数作为您的 测试数据,因为这样的结果总是一样的,而且很聪明 可以想象,编译器可以预先计算它 为了避免这个问题,测试数据应该随机生成,但是很多 否则,有效的测试会因随机选择不当而受损 数字发生器(RNG)。随机数生成可以创建耦合 在类和计时工件之间,因为大多数随机数 生成器类是线程安

本书第12.1章正确性测试,特别是第12.1.3小节测试安全(作者希望建立测试有界缓冲区类的数据竞争安全的测试用例)

为了确保您的测试实际上测试了您认为它所做的事情,它是 重要的是,校验和本身不能被 编译器。使用连续整数作为您的 测试数据,因为这样的结果总是一样的,而且很聪明 可以想象,编译器可以预先计算它

为了避免这个问题,测试数据应该随机生成,但是很多 否则,有效的测试会因随机选择不当而受损 数字发生器(RNG)。随机数生成可以创建耦合 在类和计时工件之间,因为大多数随机数 生成器类是线程安全的,因此引入了额外的 同步。为每个线程提供自己的RNG允许 使用非线程安全的RNG

我不理解作者反对使用随机数生成器生成测试输入的观点。具体来说,行随机数生成可以在类和计时工件之间创建耦合,我并不清楚

  • 他在这里指的是哪些类和计时工件

  • RNG可以产生什么样的耦合
  • 随机数生成可以在类和计时工件之间创建耦合,我不清楚

    考虑到下一句话,这一点更加清楚:

    因为大多数随机数生成器类都是线程安全的,因此会引入额外的同步

    内存同步可能会改变程序的计时。如果查看
    Random
    ,可以看到它在封面下使用了一个
    AtomicInteger
    ,因此使用它将导致读写内存障碍,作为生成测试数据的一部分,这可能会改变其他线程查看数据的方式以及整个应用程序的计时

    他在这里指的是哪些类和计时工件

    任何使用线程并依赖内存同步的类都可能受到影响。基本上,它们调用的所有线程和类


    RNG可以产生什么样的耦合

    正如蜥蜴@Bill所评论的,这本书说,通过使用RNG,程序的计时依赖于或受RNG同步的影响

    这里真正的教训是,如果可能的话,注入到程序中的测试数据不应该改变程序的计时。这通常是困难的,也可能是不可能的,但目标是在测试中尽可能多地模拟应用程序行为(计时、输入、输出等等)


    就解决方案而言,您可以使用另一个未同步的解决方案。您还可以生成一个类,该类预先存储10000个随机数(或您需要的任意数),然后在不同步的情况下分发它们。但是,通过在测试中使用一个进行内存同步的类,您正在更改程序的计时。

    “RNG可以创建什么样的耦合?”由于测试代码中使用的RNG中的同步错误而导致测试失败的测试可能会通过。@BilltheLizard可能是您应该用注释编辑答案的最后一行吗+1注释。@Gray那么目标应该是尽可能地从测试数据中删除同步?否目标是注入程序的测试数据不应改变程序的计时。例如,如果您生成了一个事先得到10000个随机数的小类,那就可以了。但是,通过在测试中使用一个进行内存同步的类,您就改变了程序的计时@Geek@Gray,这是一个非常好的注释和非常好的答案。