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

时间:2018-06-02 05:49:06

标签: testing go random

我的函数使用math/rand到"随机"来自泊松的样本和来自二项分布的另一个样本。它经常被其他函数使用,它们也返回h(g(f()))之类的随机值,其中f() g()h()是随机函数。

我在rand.Seed(n)中发出了main()来调用每次程序运行时选择不同的种子,并且工作正常。

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

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

2 个答案:

答案 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)
    }
}