如何使用生产数据在Django中运行测试(只读)?

时间:2018-09-07 23:37:24

标签: python django python-3.x unit-testing

我想在Django中运行测试,但是为了运行测试,我需要访问生产数据库中的数据(我不想建立一个全新的数据库进行测试)。

如何在不允许脚本访问权限的情况下使用生产数据库中的数据?我不希望此测试有任何影响,但是我需要访问此数据才能运行此测试。不得不启动(并付费)一个全新的数据库只是为了获取几行数据,这似乎很荒谬,有什么建议吗?

3 个答案:

答案 0 :(得分:3)

我建议您不要这样做。运行测试时,您将无法完全控制数据库的状态,而测试的通过可能取决于生产数据库的内容。而且不可能在边缘情况发生之前对其进行测试。更不用说如果您搞砸了,就有冒用测试数据填充生产数据库或破坏生产数据库中的记录的风险。

Django使创建测试数据库非常简单。使用命令python manage.py test [app_name]时,将为您创建一个测试数据库,其设置与生产/开发数据库相同。

要获得此功能,Django测试文档应声明:

  

如果测试依赖于数据库访问(例如创建或查询模型),请确保将测试类创建为django.test.TestCase而不是unittest.TestCase的子类。

有关Django测试数据库的更多信息:https://docs.djangoproject.com/en/2.1/topics/testing/overview/#the-test-database

关于您对维护测试数据库的关注,Django在测试符文运行之前启动了数据库,并在测试完成后销毁了数据库。测试数据库也在本地计算机上创建(假设您在本地计算机上运行它)。因此,我认为定价不应该成为问题。

编辑: 在测试之前填充测试数据库:

1。。在测试逻辑开始之前,在测试中创建实例。测试完成后,这些将被销毁。示例:

class Tester(TestCase):
    def test_works(self):
        instance = Model.create(data=data)
        # then run your test logic

2。。在测试类的setUp方法中创建实例。 setUp中的所有内容将在该类的每种测试方法之前(重新)创建,并在每次测试完成后销毁。示例:

class Tester(TestCase):
    def setUp(self):
        self.instance = Model.create(data=data)

    def test_works(self):
        # run test logic with access to self.instance

3。。在运行测试之前使用固定装置进行填充。在要测试的任何应用程序的fixtures目录中定义模型的某些实例的数据(可能需要创建目录)。您可以使用json或yaml定义它们,我敢肯定其他格式。然后在您的测试中:

class Tester(TestCase):
    def setUp(self):
        fixtures = ['/myapp/fixtures/dump.json']

    def test_works(self):
        # test logic and you can access all the instances created from the data in dump.json

有关灯具的更多信息:https://django-testing-docs.readthedocs.io/en/latest/fixtures.html

如果您希望测试数据库具有与生产数据库相似的数据,则可以从生产数据库中提取数据并将其保存在固定装置中。

答案 1 :(得分:0)

不要那样做。您必须使用测试的setUp来构造要测试的情况。也不要使用固定装置,因为您必须对其进行维护,将来您将更改模型,还必须更新固定装置。这很烦人。

如果您进行了良好的单元测试,则可以mock进行模型测试并测试要测试的功能。我想测试一种方法时经常这样做。

如果需要,您可以创建一些实用程序功能来帮助您设置情况,您需要创建模型和相关模型来构建要测试的环境。

答案 2 :(得分:0)

我同意其他人的观点,出于各种原因这是一个坏主意。如果仍然要继续使用它,请设置一个具有只读权限的单独数据库用户。如何执行此操作取决于您使用的数据库服务器。

再次检查您是否在测试中实际使用了只读用户的凭据。