我有一个伪随机数生成器(PRNG)类,我想进行单元测试.有两种方法:
编写一个测试用例,其中包含大量样本并测试它们是否正确分布.这种方法可能会导致测试用例的执行时间相当长;
手动计算一小部分样本,并验证PRNG算法是否重现它.这种方法可能导致在不被注意的情况下生成非随机序列;
我会说第一种方法不是真正的单元测试,因为它不执行发生器的白盒测试,但另一方面它正确地测试了类的责任.第二种方法更像是一个真正的单元测试,侧重于算法,但它没有提供足够的证据来证明该类是否履行其职责.
您更喜欢哪种方法?为什么?
Steve Jessop.. 30
获得相同PRNG算法的另一个实现,基于已知种子生成少量冗长的测试用例,并验证您的算法实现是否与其他人的实现相匹配.您测试的数据越多,它的可能性就越大.如果您想要认真,请研究如何对算法进行FIPS验证.
没有必要测试输出是否是随机的,因为其他人对算法的研究比你能够再现的更多.
如果您已经发明了自己的PRNG算法,那么您会遇到一个相当不同的问题,因为除了测试代码之外,您还需要测试新算法.有很多事情要做 - 我认为最重要的是对输出的统计测试,以及其他密码学家的同行评审.但是,基本上,如果你设计的PRNG算法没有足够的知识来知道如何测试它,那么它将是垃圾.
获得相同PRNG算法的另一个实现,基于已知种子生成少量冗长的测试用例,并验证您的算法实现是否与其他人的实现相匹配.您测试的数据越多,它的可能性就越大.如果您想要认真,请研究如何对算法进行FIPS验证.
没有必要测试输出是否是随机的,因为其他人对算法的研究比你能够再现的更多.
如果您已经发明了自己的PRNG算法,那么您会遇到一个相当不同的问题,因为除了测试代码之外,您还需要测试新算法.有很多事情要做 - 我认为最重要的是对输出的统计测试,以及其他密码学家的同行评审.但是,基本上,如果你设计的PRNG算法没有足够的知识来知道如何测试它,那么它将是垃圾.
为了测试PRNG,我会使用ENT,这是一套统计测试,可以告诉你PRNG的表现如何.我想这是方法1.
我想最终你会想要两个测试 - 因为你想确保以下两个都成立:
(1)数字分布正确,(2)特定算法按预期工作.
也许第一次测试只能偶尔运行,而第二次测试可能用于检查任何代码更改是否都没有破坏算法.