Django TestCase:在self.subTest(...)中重新创建数据库

时间:2017-09-07 14:47:53

标签: python django testing

我需要测试具有不同参数的函数,而最合适的方法似乎是使用with self.subTest(...)上下文管理器。

但是,该函数会向db写入内容,并最终处于不一致状态。我可以删除我写的东西,但如果我可以完全重新创建整个数据库,它会更清晰。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

不确定如何在self.subTest()中重新创建数据库,但我还有另一种我可能感兴趣的技术。您可以使用fixture来创建数据库的“快照”,它基本上将被复制到仅用于测试目的的第二个数据库中。我目前使用这种方法来测试我正在工作的大型项目的代码。

我会发布一些示例代码,让您了解这在实践中会是什么样子,但您可能需要做一些额外的研究来根据您的需求定制代码(我添加了链接来指导您)

这个过程相当简单。您将创建数据库的副本,其中仅包含使用灯具所需的数据,这些数据将存储在 .yaml 文件中,并且只能由您的测试单元访问。

以下是该过程的样子:

  1. 列出要复制到测试数据库的项目,以使用fixture填充它。这只会创建一个包含所需数据的数据库,而不是愚蠢地复制整个数据库。它将存储在.yaml文件中。
  2. <强> generate.py

        django.setup()
        stdout = sys.stdout
    
        conf = [
            {
                'file': 'myfile.yaml',
                'models': [
                    dict(model='your.model', pks='your, primary, keys'),
                    dict(model='your.model', pks='your, primary, keys')
                ]
            }
        ]
    
        for fixture in conf:
            print('Processing: %s' % fixture['file'])
            with open(fixture['file'], 'w') as f:
                sys.stdout = FixtureAnonymiser(f)
    
            for model in fixture['models']:
                call_command('dumpdata', model.pop('model'), format='yaml',indent=4, **model)
                sys.stdout.flush()
    
            sys.stdout = stdout
    
    1. 在您的测试单元中,将生成的.yaml文件作为夹具导入,测试将自动使用夹具中的数据进行测试,保持主数据库不受影响。
    2. <强> test_class.py

      from django.test import TestCase
      
      class classTest(TestCase):
      
          fixtures = ('myfile.yaml',)
      
          def setUp(self):
              """setup tests cases"""
             # create the object you want to test here, which will use data from the fixtures
      
          def test_function(self):
              self.assertEqual(True,True)
              # write your test here
      

      您可以在此处阅读更多内容:

      如果您有任何问题,因为事情不清楚只是问,我很乐意帮助您。