如何在生产数据库上运行djangounit testing?

我正在开始TDD的发展态度,正在为我的django应用程序编写unit testing。 我知道夹具,知道这就是testing应该执行的方式,但是对于给定的testing,我需要在整个数据库上执行它,而且对于超过1000万行数据库的json夹具不是我想要处理的此外,这个testing是“只读”的。

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

那么,如何才能在一个生产数据库上运行一个testing套件而不是临时的testing套件呢?或者更好的做法是什么?

欢迎提前意见!

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

这是一stream的批量工作,需要像一stream的生产批量工作一样对待。

您可以使用Django test命令来查看生产数据。 它总是创build一个空的数据库,从TestCase中的Fixture填充。

你可以让你的生产数据库处理一个适当的pipe理命令 。 这样就可以正确configuration环境,以便您的命令可以简单地使用Django ORM来处理数据。

另一种方法是确保您configuration您的设置 。 使用DJANGO_SETTINGS_MODULE环境variables或使用settings.configure()函数创build一个环境。

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

如果你愿意的话,你可以称它为“testing”,但是你正在查看生产数据,所以就像生产应用程序一样对待获取设置文件和使用正确的ORMconfiguration。

如果有人在这里search一个给定的问题的解决scheme,这里是如何执行Django的生产数据库的unit testing的骨架。 检查这里的django文档部分,文件/目录结构,以及在哪里放置给定的代码的说明。 它应该放在yourapp/management/commands/newcommandname.py ,pipe理和命令文件夹都应该包含空的__init__.py文件,这使python将它们视为有效的模块。

testing套件可以运行如下:

$ python manage.py newcommandname

这里来的代码你应该放在yourapp/management/commands/newcommandname.py

 from django.core.management.base import NoArgsCommand import unittest class Command(NoArgsCommand): help = """ If you need Arguments, please check other modules in django/core/management/commands. """ def handle_noargs(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) 

这个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 

unit testing是为了testing没有任何副作用。 尽pipe你的testing不会被称为unit testing。 如果你想这样做,你可以使用自定义的testing运行器来设置数据库(或者使用现有的数据库)。

您可以在settings.py文件中设置TEST_RUNNER设置。 默认位于django.test.simple.run_tests 。 你可以看看这里的源代码: http : //code.djangoproject.com/browser/django/trunk/django/test/simple.py

将代码复制并粘贴到新文件中,并从代码中删除以下行:

connection.creation.create_test_db(verbosity, autoclobber=not interactive)

connection.creation.destroy_test_db(old_name, verbosity)

这将阻止Django创build一个testing数据库,并重置您的设置文件的数据库configuration。