我最近遇到了以下piece of documentation。粗略的搜索只发现了一个gist。所以我决定把这些想法付诸实践。你知道吗
第一个远远没有被使用。第二个太冗长了,在失败的情况下不起作用(failureException
应该是class,相应的方法可以注释掉)。你知道吗
在我描述我的解决方案之前,让我问一些问题。1.我做错什么了吗?这种工作早就简化了。至少在我的书里。2.有什么方法可以改进我的解决方案吗?你知道吗
first one(分支factory-boy-state
)将随机生成器的状态存储在文件中,以后可以使用这些文件将状态传递给测试:
class MyTestRunner(DiscoverRunner):
def setup_test_environment(self):
self.handle_rnd_state(faker.generator.random, 'faker.state',
'FAKER_RANDOM_STATE')
self.handle_rnd_state(factory.random.randgen, 'factory.state',
'FACTORY_RANDOM_STATE')
super().setup_test_environment()
def handle_rnd_state(self, rnd, fname, env_var):
state = self.retrieve_rnd_state(fname, env_var)
if state:
rnd.setstate(state)
else:
self.store_rnd_state(fname, rnd.getstate())
def retrieve_rnd_state(self, fname, env_var):
state = os.environ.get(env_var)
return pickle.loads(b64decode(state.encode('ascii'))) if state else None
def store_rnd_state(self, fname, state):
encoded_state = b64encode(pickle.dumps(state))
with open(fname, 'w') as f:
f.write(encoded_state.decode('ascii'))
用法:
$ ./manage.py test --testrunner p1.tests.MyTestRunner
$ FAKER_RANDOM_STATE=`cat faker.state` FACTORY_RANDOM_STATE=`cat factory.state` ./manage.py test --testrunner p1.tests.MyTestRunner
Another one(branchfactory-boy-seed
)为随机生成器设置种子,但是可以通过环境变量覆盖种子:
class MyTestRunner(DiscoverRunner):
def setup_test_environment(self):
seed = os.environ.get('FACTORY_SEED')
if seed:
seed = seed.encode('ascii')
if not seed:
seed = b64encode(os.urandom(16))
print('-- seed: %s' % seed.decode('ascii'))
factory.random.reseed_random(seed)
super().setup_test_environment()
用法:
$ ./manage.py test --testrunner p1.tests.MyTestRunner
$ FACTORY_SEED=IPnHCxdWehAxz6ctbNvyPQ== ./manage.py test --testrunner p1.tests.MyTestRunner
测试运行程序可以放入settings。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐