【问题标题】:Why not use a pseudo random number generator to produce test data?为什么不使用伪随机数生成器来生成测试数据?
【发布时间】:2013-09-15 20:50:44
【问题描述】:

来自Java Concurrency in Practice 的书,第 12.1 章 正确性测试,特别是在 12.1.3 小节 测试安全(作者想要设置测试用例的地方用于测试有界缓冲区类的数据竞争安全性)

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

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

我不明白作者反对使用随机数生成器生成测试输入的观点。具体来说,Random number generation can create coupling between classes and timing artifacts这行我不清楚。

  1. 他在这里指的是哪些和计时工件?
  2. RNG 可以创建什么样的耦合?

【问题讨论】:

    标签: java multithreading random concurrency java.util.concurrent


    【解决方案1】:

    随机数生成会在类和计时工件之间产生耦合我不清楚。

    考虑到下一句,这就更清楚了:

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

    内存同步可能会改变程序的时序。如果您查看Random,您会发现它在幕后使用AtomicInteger,因此使用它会导致读写内存障碍作为测试数据生成的一部分,这可能会改变其他线程查看数据的方式和整个申请的时间安排。

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

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

    RNG 可以创建什么样的耦合?

    正如@Bill the Lizard 所评论的那样,这本书是说通过使用 RNG,程序的时间将依赖于或受 RNG 同步的影响。

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

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

    【讨论】:

    • “RNG 可以创建什么样的耦合?”由于测试代码中使用的 RNG 中的同步,由于被测类中的不正确同步而应该失败的测试可能会通过。
    • @BilltheLizard 也许你应该用你的评论编辑答案的最后一行?为评论 +1。
    • @Gray 所以目标应该是尽可能地从测试数据中删除同步?
    • 不,目的是您注入程序的测试数据应该改变程序的时间。例如,如果你生成了一个预先获得 10000 个随机数的小类,那就没问题了。但是通过在你的测试中使用一个进行内存同步的类,你正在改变你的程序@Geek的时间。
    • @Gray 总体上出色的评论和出色的回答。
    猜你喜欢
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 2014-05-18
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多