如何用自定义TestRunner让Django 2测试连接现有SQL Server数据库?
解决Django 2测试复用现有SQL Server数据库的TestRunner问题
你遇到的AttributeError是因为DiscoverRunner实例本身并没有connections属性,你需要直接使用Django提供的数据库连接模块,同时还要正确返回测试数据库配置,这样Django的测试框架才能正常识别并使用现有数据库。
下面是修改后的ExistingDbTestRunner代码,完全适配你的需求:
from django.test.runner import DiscoverRunner from django.db import connections class ExistingDbTestRunner(DiscoverRunner): """测试时复用现有数据库,不创建/销毁测试库""" def setup_databases(self, **kwargs): # 直接使用settings中配置的default数据库 connection = connections['default'] # 确保连接已建立 if not connection.is_usable(): connection.connect() # 需要返回测试数据库的配置结构,Django测试框架依赖这个返回值 return ( [('default', connection.settings_dict, True, False)], False, ) def teardown_databases(self, old_config, **kwargs): # 不需要销毁数据库,直接pass pass
关键修改点说明:
- 导入
django.db.connections来获取数据库连接,而不是试图从runner实例获取connections属性,这是你之前出错的核心原因。 - 添加了连接可用性检查
connection.is_usable(),避免重复连接或连接失效的问题。 - 正确返回了Django测试框架需要的配置元组:第一个元素是包含数据库配置的列表(格式为
(别名, 配置字典, 是否是镜像, 是否创建了数据库)),第二个元素表示是否是并行测试模式(这里设为False即可)。
额外配置提示:
为了确保测试不会污染你的生产副本数据库,建议在settings中单独配置测试数据库指向这个副本(而不是直接用生产库),比如:
# settings.py DATABASES = { 'default': { # 生产数据库配置 }, 'test': { # 生产副本数据库配置,和default结构一致 'ENGINE': 'sql_server.pyodbc', 'NAME': 'your_prod_copy_db', 'USER': 'your_test_user', # 其他SQL Server相关配置... } }
然后在TestRunner里指定使用test连接,或者直接在运行测试时通过命令行指定:
python manage.py test --testrunner=your_app.tests.ExistingDbTestRunner --database=test
这样就能确保测试完全复用你指定的现有数据库,不会创建新的测试库,也不会在测试结束后销毁数据。
内容的提问来源于stack exchange,提问作者Hanny
相关产品推荐
相关产品推荐

