我开始采用TDD开发态度,并为django应用程序编写单元测试。我知道固定装置,并且知道应该执行测试的方式,但是对于给定的测试,我确实需要在整个数据库上执行它,而我想处理的10百万以上行数据库的json固定装置,此外,此测试是“只读”的。
因此,问题是如何设置测试套件以在生产数据库上运行?我想这就像在某些测试的setUp方法中添加DATABASE_NAME设置一样容易。但是运行测试时,settings.DATABASE_NAME =“ prod_db”导致“ NameError:全局名称'settings'未定义”。此外,http://code.djangoproject.com/ticket/11987中描述了一种风险,即你可能会意外删除生产数据库。
那么,如何在生产数据库上而不是临时数据库上对测试套件运行单个测试,或者甚至更好的是最佳实践是什么?
提前为任何意见加油!
首先,如果要在生产数据库上运行它,那么它就不是一个“单元”测试。
这是一流的批处理作业,需要像一流的生产批处理作业一样对待。
你不会使用Django test命令查看生产数据。它总是创建一个空数据库,该数据库由TestCase中的夹具填充。
test
你可以使你的生产数据库处理适当的管理命令。这已经正确配置了所有环境,因此你的命令可以仅使用Django ORM来处理数据。
另一种方法是确保配置设置。使用DJANGO_SETTINGS_MODULE环境变量或使用settings.configure()函数创建环境。
DJANGO_SETTINGS_MODULE
settings.configure()
然后,你可以导入模型并针对生产数据库执行要执行的处理。
如果愿意,可以将其称为“测试”,但是你正在查看生产数据,因此就获取设置文件和使用正确的ORM配置而言,必须将其视为生产应用程序。
如果有人在这里谷歌搜索给定问题的解决方案,这是如何在Django生产数据库上执行单元测试的框架。检查Django文档节在这里,文件/目录结构,并在那里把给定的代码指令。它应该进入yourapp/management/commands/newcommandname.py,管理文件夹和命令文件夹都应包含空__init__.py文件,这使python将其视为有效模块。
yourapp/management/commands/newcommandname.py
__init__.py
该测试套件可以通过以下方式运行:
$ python manage.py newcommandname
这是你应该放入的代码yourapp/management/commands/newcommandname.py:
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)