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

Jam*_*mes 22 python django unit-testing

我正在开始TDD开发态度,正在为我的django应用程序编写单元测试.我知道固定装置并且知道测试应该执行的方式,但是对于给定的测试,我确实需要在整个数据库上执行它,并且用于10万行数据库的json fixture不是我想要处理的东西此外,这个测试是"只读".

那么问题是如何设置测试套件以在生产数据库上运行?我想这可能就像在某些测试的setUp方法中添加DATABASE_NAME设置一样简单.但是settings.DATABASE_NAME ="prod_db"在运行测试时导致"NameError:全局名称'设置'未定义".此外,http://code.djangoproject.com/ticket/11987中描述了一种风险,您可能会意外删除生产数据库.

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

任何意见提前干杯!

Jam*_*mes 63

如果有人谷歌在这里搜索给定问题的解决方案,这里是如何在django生产数据库上执行单元测试的框架.检查Django文档节在这里,文件/目录结构,并在那里把给定的代码指令.它应该进入yourapp/management/commands/newcommandname.py,管理和命令文件夹都应包含空__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)
Run Code Online (Sandbox Code Playgroud)

  • `NoArgsCommand`现已弃用,将在Django 1.10中删除 - 现在最好的做法是使用默认为无参数的`BaseCommand`.所有你需要从上面的回答改变是:从`进口django.core.management.base ... BaseCommand``类司令部(BaseCommand)`...`高清处理(自我,**选项)`. (6认同)
  • +1用于回答问题并通过创建新的管理命令来显示如何执行此操作. (3认同)

S.L*_*ott 12

首先,如果您在生产数据库上运行它,那么它不是一个"单元"测试.

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

您不能使用Django test命令查看生产数据.它总是创建一个空数据库,该数据库从TestCase中的fixture中填充.

您可以使生产数据库处理适当的管理命令.这个环境都已正确配置,因此您的命令可以简单地使用Django ORM来处理您的数据.

另一种方法是确保配置您的设置.使用DJANGO_SETTINGS_MODULE环境变量或使用该settings.configure()函数创建环境.

然后,您可以导入模型并对生产数据库执行要执行的处理.

如果您愿意,可以将其称为"测试",但是您正在查看生产数据,因此在获取设置文件和使用正确的ORM配置方面,它必须被视为生产应用程序.


Noe*_*oel 6

此 TEST_RUNNER 适用于 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
Run Code Online (Sandbox Code Playgroud)

  • 对于 Django 1.8,子类化 `DiscoverRunner` 类(`from django.test.runner import DiscoverRunner`)。 (5认同)