gpt4 book ai didi

testing - golang中单元测试的种子随机数

转载 作者:IT王子 更新时间:2023-10-29 01:44:18 27 4
gpt4 key购买 nike

我有一些函数使用 math/rand 从泊松分布和二项分布中“随机”抽样。它经常被其他也返回随机值的函数使用,例如 h(g(f())) 其中 f() g()h() 是随机函数。

我在 main() 中放置了一个 rand.Seed(n) 调用,以便在每次程序运行时选择不同的种子,并且它工作正常。

我的问题是针对这些 PRNG 函数的单元测试以及使用内置 testing 包使用它们的函数。我想消除随机性,以便我可以有一个可预测的值来进行比较。

放置常量值种子以获得确定性输出的最佳位置在哪里?在测试文件的 init() 或每个测试函数内部,或其他地方?

最佳答案

你当然不应该把它放在测试 init() 函数中。为什么?因为执行顺序(或者即使运行测试函数)是不确定的。有关详细信息,请参阅 How to run golang tests sequentially?

这是什么意思?

如果您有 2 个测试函数(例如 TestA()TestB()),这两个测试函数都会调用 math/rand,您无法保证 TestA() 是先运行还是 TestB(),或者即使其中任何一个将被调用。因此 math/rand 返回的随机数据将取决于此顺序。

更好的选择是将种子放入 TestA()TestB() 中,但这可能还不够,因为测试可能并行运行,因此随机math/rand 返回的数据也可能是不确定的。

要真正获得确定性测试结果,需要随机数据的函数需要接收 math.Rand值并显式使用它,在测试中,您可以创建单独的、不同的 math.Rand 值,这些值不会被其他测试使用,因此将它们播种为常量值并仅在测试函数中使用它们那么您能否获得确定性结果,而不取决于调用测试函数的方式和顺序。

关于testing - golang中单元测试的种子随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50653929/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com