使用随机输出测试功能

时间:2010-11-18 20:04:04

标签: unit-testing testing random

  • 我正在研究测试神经网络库的测试项目......
  • 问题是该库有时会使用随机数..
  • 我需要派生测试用例(输入,预期输出,实际输出)......

是否有人知道如何在执行操作和评估输出时使用随机数的函数派生测试用例(输入,预期输出,实际输出)?

2 个答案:

答案 0 :(得分:4)

是的,您要么必须运行足够多的案例,以便随机性平均,或者您将随机源作为您的函数或方法的另一个输入,以便您可以独立测试它。

第一种示例(这是Python,但原则可以适用于任何语言)。

def test_random_number():
    total = sum(random.uniform(0, 1) for _ in xrange(1000))
    assert 100 < total < 900

所以如果你不幸的话,这个测试可能会失败,但它仍然是一个合理的测试,因为它几乎所有时间都会通过,而且进行这种测试非常简单。

要“正确”做事,你需要注入随机源。

class DefaultRandomBehavior(object):
    def pick_left_or_right(self):
        return random.choice(['left', 'right'])

class AardvarkModeller(object):
    def __init__(self, random_source=None):
        self.random_source = random_source or DefaultRandomBehavior()

    def aardvark_direction(self):
        r = self.random_source.pick_left_or_right()
        return 'The aardvark faces ' + r

现在,您可以通过模拟或伪造DefaultRandomBehavior类来对此进行单元测试,从而完全避开非确定性。

答案 1 :(得分:2)

库不太可能真正使用随机数,因为计算机并不是很擅长生成它们。相反,它可能使用以某种方式播种的伪随机数发生器,可能来自“真实”的随机源或可能来自当前时间。使结果可重复的一种方法是教图书馆能够接受用户提供的PRNG种子并将其设置为测试用例的常量。然后,随机数的内部序列对于您的测试总是相同的。

第二种(也许更有用)方法是以近似方式比较预期输出和实际输出。如果使用随机数对您的计算产生如此大的影响,结果实际上不可重现,您可能需要考虑计算的有用性。诀窍是找到库的输出的一些属性,可以用数字比较,允许的错误,所以我怀疑你想要比较用神经网络做某事的结果,而不是直接比较网络。