django - 跳过为只读、外部管理、高安全性、大型数据库创建 Django 测试数据库
问题描述
在 Django 测试期间,我们需要为众多外部数据源之一使用真实数据:
- 数据由外部管理且只读
- 通过
manage.py inspectdb
生成的 ORM 类访问数据 - 数据是高度敏感的,我们不允许存储实际数据的固定装置
- 表是遗留设计,将被逐步淘汰,数百个具有复杂关系的表,即使获取单个记录也很复杂
- 有太多事情要做,我不愿意花费时间来生成固定装置,保证它们被混淆,获得混淆的批准并证明保留它只是为了让我们在几个月内架起桥梁
我们了解缺点:这违反了测试纯度并引入了潜在的安全风险。我们愿意在这两个方面做出妥协,以使我们度过接下来的几个月,届时我们将逐步淘汰这个有问题的数据源。
在这种情况下,我需要 Django 了解我不希望它为此源建立一个测试数据库,而只使用实际源,这样我们就可以运行一些快速检查并离开。
在充分理解和接受风险和建议的情况下,实现这一目标的最简单方法是什么?
解决方案
对我们来说,解决方案是自定义测试运行器。
在Django 的高级测试主题文档的帮助下,我们像这样覆盖了默认值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
通过这种方式,我们的测试现在跳过了为我们凌乱的遗留数据库创建测试数据库,并且我们测试的逻辑从实际数据源中提取数据,允许我们实施快速检查以确保这些代码路径有效。
推荐阅读
- java - JTA中事务管理器的具体流程是什么
- c# - 如何节省统一花费的最少时间?
- azure-active-directory - MS Teams Bot:对于来自 BotBuilder-Samples 的 Teams 对话机器人,网络聊天中的测试未经授权
- javascript - 打算在完全执行的其他 js 文件中加载 JQuery 一次函数
- typescript - 当值已设置为 false 时,是否需要在 typescript 中指定数据类型 boolean?
- wpf - WPF:单击时不会关闭列表框或菜单(在 Telerik Splitbutton 内)
- swift - RxSwift:如何响应一系列通知?
- javascript - 一个关于道具的javascript reactjs问题
- android - 不知道位置时的 notifyItemInserted 和 notifyItemRangeInserted
- samsung-mobile - J7 Prime SamsungExperienceServices 不断停止