我的函数使用math/rand
到"随机"来自泊松的样本和来自二项分布的另一个样本。它经常被其他函数使用,它们也返回h(g(f()))
之类的随机值,其中f()
g()
和h()
是随机函数。
我在rand.Seed(n)
中发出了main()
来调用每次程序运行时选择不同的种子,并且工作正常。
我的问题是这些PRNG函数的单元测试以及使用内置testing
包使用它们的函数。我想删除随机性,以便我可以有一个可预测的值来进行比较。
在哪里放置我的恒定值种子以获得确定性输出的最佳位置?在测试文件的init()或每个测试函数内部,还是在其他地方?
答案 0 :(得分:0)
作为传递math.Rand
的替代方法,您可以使用 IF 进行修补,您不希望依赖注入成为包的API的一部分,例如:https://play.golang.org/p/cIGxhO0wSbo < / p>
答案 1 :(得分:0)
要与并行测试执行保持兼容,请创建自己的rand.Rand。
我的示例包括标准软件包Check()
中的testing/quick
,该软件包通常用于对数百个伪随机参数执行测试。 (类似于OP的情况,该函数使您的测试非常依赖RNG种子。)
package main
import (
"math/rand"
"testing"
"testing/quick"
)
func TestRandomly(t *testing.T) {
r := rand.New(rand.NewSource(0))
config := &quick.Config{Rand: r}
assertion := func(num uint8) bool {
// fail test when argument is 254
return num != 254
}
if err := quick.Check(assertion, config); err != nil {
t.Error("failed checks", err)
}
}