在 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/