有一些应用程序域(例如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
此函数根据几个随机操作生成项目的丢弃。如果要自动验证此功能的正确性,则会出现此问题。生成的值不是确定性的,回归测试的编写似乎是不可能的。
我的问题是:
答案 0 :(得分:3)
有用的单元测试之一如下:
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是项目下降的概率。
答案 1 :(得分:2)
我会重写函数以使用依赖注入(随机数生成器作为参数传递给函数)。然后你可以传递一个随机数生成器的模拟,用不同的确定性“随机”输入来测试你的函数。
当然,您也可以测试不依赖于随机调用结果的断言。如:
我绝不会写出具有非确定性结果的单元测试,即使是千分之一。我关心每一次测试失败,随机结果会令人不安。你最好封装你的随机性,这样就可以独立于随机数生成器测试函数。