django - 跳过 Django 测试数据库创建以获取只读、外部管理、高安全性、大型数据库

标签 django database testing orm

在 Django 测试期间,我们需要对众多外部数据源之一使用真实数据:

  • 数据由外部管理且只读
  • 数据通过manage.py inspectdb访问生成的 ORM 类
  • 数据高度敏感,我们不允许存储实际数据的固定装置
  • 表是遗留设计,将被淘汰,数百个表,关系复杂,即使获取单个记录也很复杂
  • 有太多的事情要做,我不愿意花时间来生成固定装置,保证它们被混淆,获得混淆的批准并证明保留它只是为了在我们几个月内架起桥梁

我们了解其缺点:这违反了测试纯度并引入了潜在的安全风险。我们愿意在这两方面做出妥协,以便在接下来的几个月内逐步淘汰这个有问题的数据源。

在这种情况下,我需要 Django 明白我不希望它为此源建立测试数据库,而只使用实际源,这样我们就可以运行一些快速检查并离开。

在充分理解和接受风险和建议的情况下,实现这一目标的最简单方法是什么?

最佳答案

对于我们来说,解决方案是自定义测试运行程序。

Django's Advanced Testing Topics documentation 的帮助下,我们重写了默认的 DiscoverRunner,如下所示:

from django.test.runner import DiscoverRunner


def should_create_db(db_name):
    # analyse db_name, a key from DATABASES, to determine whether a test
    # database should be created
    return db_name != 'messy_legacy_database'


class CustomTestRunner(DiscoverRunner):
    
    # override method from superclass to selectively skip database setup
    def setup_databases(self, **kwargs):
        # 'aliases' is a set of unique keys from settings DATABASES dictionary
        aliases = kwargs.get('aliases')
        filtered = set([i for i in aliases if should_create_db(i)])
        kwargs['aliases'] = filtered
        # 'aliases' now contains only keys which trigger test database creation
        return super().setup_databases(**kwargs)

    # there was no need to override teardown_databases()

接下来我们更新settings.py以使用我们的覆盖而不是默认的运行器:

TEST_RUNNER = 'path.to.CustomTestRunner'

最后我们告诉我们的测试类它可以使用哪些数据库:

from django.test import TestCase


class OurTest(TestCase):
    databases = [
        'default',
        'messy_legacy_database',
    ]

    def test_messy_legacy_database(self):
        # go nuts on your messy legacy database testing calls
        pass

通过这种方式,我们的测试现在可以跳过为困惑的遗留数据库创建测试数据库的过程,并且我们测试的逻辑从实际数据源中提取数据,从而使我们能够实现快速检查以确保这些代码路径正常工作。

关于django - 跳过 Django 测试数据库创建以获取只读、外部管理、高安全性、大型数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61933056/

相关文章:

mysql - SQL 表的最大大小是多少

angular - 从测试中访问最终管道内的值

c# - 以编程方式删除 XP/Vista/7 中的 TCP/IP 限制

django - 预构建的 Django 项目在迁移时出错

python - NoReverseMatch Django 教程 1.8

javascript - 在 Javascript 中保留尾随零

java - android:如何在java中运行ui测试

python - django 媒体和缓存错误

iOS App 数据库选择

database - 如何将sql server 2008数据库上传到生产服务器