如何在生产数据库上运行Django单元测试?

2024-05-23 19:31:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开始TDD开发态度,并为django应用程序编写单元测试。我知道fixture,知道这是应该执行测试的方式,但是对于给定的测试,我确实需要在整个数据库上执行它,而1000多万行数据库的json fixture不是我想处理的,而且,这个测试是“只读的”。

所以问题是如何设置测试套件以在生产数据库上运行?我想这可以像在特定测试的设置方法中添加数据库名称设置一样简单。但是在运行测试时,settings.DATABASE_NAME=“prod_db”会导致“NameError:global NAME'settings'未定义”。此外,还有http://code.djangoproject.com/ticket/11987中描述的风险,您可能会意外删除生产数据库。

那么,如何在生产数据库上运行测试套件的单个测试,而不是在临时数据库上运行测试套件,或者更好地说,什么是最佳实践?

提前为任何意见欢呼!


Tags: django方法name名称数据库json应用程序settings
3条回答

如果有人在这里用google搜索给定问题的解决方案,这里是关于如何在django生产数据库上执行单元测试的框架。查看django docs部分here,了解文件/目录结构,以及有关将给定代码放在何处的说明。它应该放在yourapp/management/commands/newcommandname.py,management和commands文件夹都应该包含空的__init__.py文件,这使得python将它们视为有效的模块。

测试套件可以运行为:

$python manage.py newcommandname

下面是您应该放在yourapp/management/commands/newcommandname.py中的代码:

from django.core.management.base import BaseCommand
import unittest

class Command(BaseCommand):
    help = """
    If you need Arguments, please check other modules in 
    django/core/management/commands.
    """

    def handle(self, **options):
        suite = unittest.TestLoader().loadTestsFromTestCase(TestChronology)
        unittest.TextTestRunner().run(suite)


class TestChronology(unittest.TestCase):
    def setUp(self):
        print "Write your pre-test prerequisites here"

    def test_equality(self):
        """
        Tests that 1 + 1 always equals 2.
        """
        from core.models import Yourmodel
        self.failUnlessEqual(1 + 1, 2)

此测试运行程序在Django 1.3上运行

from django.test.simple import DjangoTestSuiteRunner as TestRunner

class DjangoTestSuiteRunner(TestRunner):
    def setup_databases(self, **kwargs):
        pass

    def teardown_databases(self, old_config, **kwargs):
        pass

首先,如果您在生产数据库上运行它,它就不是什么“单元”测试。

这是一流的批处理作业,需要像一流的生产批处理作业一样对待。

您不能使用Djangotest命令来查看生产数据。它总是创建一个空数据库,该数据库是从TestCase中的fixtures填充的。

您可以使生产数据库处理正确的management command。这使得环境得到了正确的配置,这样您的命令就可以简单地使用Django ORM来处理您的数据。

另一种方法是确保配置了settings。或者 使用DJANGO_SETTINGS_MODULE环境变量或使用settings.configure()函数创建环境。

然后可以导入模型并对生产数据库执行所需的处理。

如果愿意,可以称之为“test”,但您正在查看生产数据,因此在获取设置文件和使用正确的ORM配置方面,必须将其视为生产应用程序。

相关问题 更多 >