为测试播种随机生成器
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).
我使用 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).