如何在生产数据库上运行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。
- 如何在Django的CharField中添加占位符?
- Django Rest框架中的用户authentication+ Angular.js Web应用程序
- 在Django中testing“不同层次”的最佳实践是什么?
- 如何禁用django-rest-framework的pipe理式浏览界面?
- 无法比较天真和认识datetime.now()<= challenge.datetime_end
- 什么是在Django“slu?”?
- {%load staticfiles%}和{%load static%}之间有什么区别
- django – 将列表转换回查询集
- Django SMTPAuthenticationError