[英]Seeding the random generator for tests
我使用factory-boy
的get_random_state
/ set_random_state
工作,虽然这并不容易。 最大的缺点是值很大。 所以想到的事情就是把它写到一个文件中。 但是,如果我不小心运行了测试而不告诉它从文件中播种,那么值就会丢失。 现在我考虑了一下,我也可以显示值(想想tee
)。 但我仍然想将其减少到 4-5 位数。
我的想法如下。 通常,当您在某处运行测试时,它会显示“种子:4215”。 然后要重现相同的结果,我必须进行SEED=4215./manage.py test
或其他操作。
我用factory-boy
做了一些实验,但后来我意识到即使使用random
模块本身也无法实现这一点。 我尝试了不同的想法。 到目前为止,他们都失败了。 最简单的是这样:
import random
import os
if os.getenv('A'):
random.seed(os.getenv('A'))
else:
seed = random.randint(0, 1000)
random.seed(seed)
print('seed: {}'.format(seed))
print(random.random())
print(random.random())
/app $ A= python a.py
seed: 62
0.9279915658776743
0.17302689004804395
/app $ A=62 python a.py
0.461603098412836
0.7402019819205794
为什么结果不同? 以及如何使它们相等?
目前您的类型不同:
if os.getenv('A'):
random.seed(os.getenv('A'))
else:
seed = random.randint(0, 1000)
random.seed(seed)
print('seed: {}'.format(seed))
在第一种情况下,您有一个str
,而在第二种情况下,您有一个int
。 您可以通过在第一种情况下强制转换int
来解决此问题:
random.seed(int(os.getenv("A")))
我也没有完全遵循您直接random
播种的需要; 我认为使用 Factory Boy 你可以使用factory.random.reseed_random
( source )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.