如何验证随机函数的正确性?

2024-04-30 02:47:44 发布

您现在位置:Python中文网/ 问答频道 /正文

有些应用程序域(例如GameDev)中有许多函数应该使用随机值来创建,以生成它们的输出。其中一个例子如下:

def generate_key(monster_key_drop_coef):
    key_letters = string.ascii_uppercase
    rand = random.random()
    if monster_key_drop_coef < rand:
        return None

    button = {}
    button["type"] = random.choice([1,2,3])
    button["letter"] = random.choice(key_letters)
    return button

此函数基于几个随机操作生成项目的放置。如果要自动验证此函数的正确性,则会出现问题。生成的值不是确定性的,编写回归测试似乎是不可能的。在

我的问题是:

  1. 这有可能为这种类型编写有用的回归测试吗 功能?在
  2. 在这种情况下,是否有创建其他类型测试的通用方法?在

Tags: key函数应用程序类型returnbuttonrandom例子
2条回答

我将重写函数以使用依赖注入(随机数生成器作为参数传递给函数)。然后,您可以传递一个随机数生成器的模拟,用不同的确定性“随机”输入测试函数。在

当然,您也可以测试不依赖于random调用结果的断言。例如:

  • 这些函数返回None或带有键“type”和“letter”的dict。在
  • 如果返回字典,则值具有适当的类型和范围。在

我绝不会写一个有非确定性结果的unittest,即使是千分之一。我关心每一次测试失败,而随机结果会令人不安。最好封装随机性,这样函数就可以独立于随机数生成器进行测试。在

下面介绍一个有用的单元测试:

def test_generate_key():
    button_list = []
    for _ in range(1, 1000):
        button_list.append(generate_key(0.2))

    is_all_none = True
    is_not_none = False
    for key in button_list:
        is_all_none &= (key is None)
        is_not_none |= (key is not None)

    assert is_all_none == False
    assert is_not_none == True

它验证函数签名,覆盖函数代码的所有行(概率很高),在99.999%的情况下通过。还验证了函数从1000中至少产生一个下降,有时不生成下降。 0.2是物品掉落的概率。在

相关问题 更多 >