一尘不染

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

django

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

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

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

提前为任何意见加油!


阅读 508

收藏
2020-03-29

共2个答案

一尘不染

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

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

你不会使用Django test命令查看生产数据。它总是创建一个空数据库,该数据库由TestCase中的夹具填充。

你可以使你的生产数据库处理适当的管理命令。这已经正确配置了所有环境,因此你的命令可以仅使用Django ORM来处理数据。

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

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

如果愿意,可以将其称为“测试”,但是你正在查看生产数据,因此就获取设置文件和使用正确的ORM配置而言,必须将其视为生产应用程序。

2020-03-29
一尘不染

如果有人在这里谷歌搜索给定问题的解决方案,这是如何在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)
2020-03-29