我有用于math/rand从泊松和另一个从二项式分布“随机”采样的函数。它经常被其他也返回随机值的函数使用,比如h(g(f()))wheref() g()和h()are random 函数。
每次程序运行时,我都会rand.Seed(n)打电话main()来选择不同的种子,并且运行良好。
我的问题是针对这些 PRNG 函数以及使用内置testing包使用它们的函数的单元测试。我想消除随机性,以便我可以有一个可预测的值进行比较。
在哪里放置恒定值种子以获得确定性输出的最佳位置?在测试文件的 init() 或每个测试函数内部,还是其他地方?
你当然不应该把它放在测试init()函数中。为什么?因为执行顺序(或者即使测试函数运行)是不确定的。有关详细信息,请参阅如何顺序运行 golang 测试?
这是什么意思?
如果您有 2 个测试函数(例如TestA()和TestB()),这两个测试函数都调用math/rand,则您无法保证是否TestA()首先运行 或TestB(),或者即使其中任何一个都会被调用。因此返回的随机数据math/rand将取决于此顺序。
更好的选择是将种子放入TestA()和中TestB(),但这也可能是不够的,因为测试可能并行运行,因此返回的随机数据math/rand也可能是不确定的。
为了真正获得确定性的测试结果,需要随机数据的函数需要接收一个math.Rand值并显式地使用该值,并且在测试中,您可以创建单独的、不同的math.Rand值,这些值不会被其他测试使用,因此将这些值播种为常量值并使用只有这样,您才能获得确定性结果,而该结果不依赖于测试函数的调用方式和顺序。
| 归档时间: |
|
| 查看次数: |
4066 次 |
| 最近记录: |