Python 如何验证使用随机变量的函数的正确性?

Python 如何验证使用随机变量的函数的正确性?,python,testing,random,regression-testing,Python,Testing,Random,Regression Testing,有些应用程序域(例如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

有些应用程序域(例如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
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
def生成密钥(怪物密钥丢弃密钥):
key_字母=string.ascii_大写
rand=random.random()
如果怪物钥匙掉落系数<兰德:
一无所获
按钮={}
按钮[“类型”]=随机选择([1,2,3])
按钮[“字母”]=随机选择(按键字母)
返回按钮
此函数基于几个随机操作生成项目的放置。如果要自动验证此函数的正确性,则会出现此问题。生成的值是不确定的,编写回归测试似乎是不可能的

我的问题是:

  • 是否可以为这种类型的数据编写有用的回归测试 功能
  • 在这种情况下,是否有创建其他类型测试的一般方法

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

    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
    
    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是物品掉落的概率

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

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

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

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

    关于这个主题有很多书。示例:模拟RNG以交付已知结果(然后使用已知预期结果的特定输出进行测试)是一种方法。