可再现的随机测试

时间:2019-06-26 21:30:59

标签: python testing random django-unittest factory-boy

我最近遇到了以下piece of documentation。粗略的搜索只显示了gist。因此,我决定将这些想法变为现实。

第一个远未按原样使用。第二个单词过于罗y,如果出现故障则无法正常工作( hdrs = [ "lib\my_test_lib\include\*"] 应该是class,可以注释掉相应的方法)。

在描述解决方案之前,让我询问问题。 1。我做错什么了吗?这种任务一定是在很久以前就已经简化了。至少在我的书中。 2。。有什么方法可以改善我的解决方案?

first one(分支failureException)将随机生成器的状态存储在文件中,以后可用于将状态传递给测试:

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'))

Another one(分支$ ./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 )为随机生成器提供种子,但是可以通过环境变量覆盖种子:

factory-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()

可以将测试运行器放入settings

0 个答案:

没有答案