Django运行TestCase时ArrivalProbabilities模型QuerySet返回空列表问题
Django测试无法读取本地MariaDB业务数据的解决方案
你遇到的问题是Django测试的默认隔离机制导致的:Django为了避免测试操作影响开发/生产环境的真实数据,执行python manage.py test时默认会创建独立的临时测试库,该库初始状态为空,不会同步你本地MariaDB中的已有业务数据,测试完成后会自动销毁该临时库。
方案1:直接连接本地现有数据库(仅适合临时测试)
适合你只想快速验证现有业务数据的测试场景,配置方法:
在项目settings.py的DATABASES配置块中,给默认连接增加TEST配置项:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '你现有业务库的库名', 'USER': '数据库用户名', 'PASSWORD': '数据库密码', 'HOST': '127.0.0.1', 'PORT': '3306', # 新增以下TEST配置 'TEST': { 'NAME': '你现有业务库的库名', 'CREATE_DB': False, # 禁止创建新的测试库 } } }
注意:该方案下测试的增删改操作会直接修改你本地业务库的数据,操作前请做好数据备份
方案2:使用Django标准测试数据注入方式(推荐)
符合Django测试规范,完全隔离不会影响真实数据,有两种常用实现方式:
方式A:导入现有业务数据作为测试fixture
- 先把本地业务库中你需要的表数据导出为fixture文件:
python manage.py dumpdata 你的APP名称.ArrivalProbabilities --output arrival_fixture.json
- 在你的APP目录下新建
fixtures文件夹,把导出的arrival_fixture.json放到该文件夹内 - 在你的测试类上声明使用该fixture:
class TestArrivalProbabilities(TestCase): fixtures = ['arrival_fixture.json'] # 新增这一行 def test_get_queryset_test(self): # 原有测试逻辑不变 ...
测试运行时Django会自动把fixture中的数据加载到临时测试库中。
方式B:在setUp方法中手动造测试数据
直接在测试类中定义setUp方法,每次测试执行前自动插入测试数据:
class TestArrivalProbabilities(TestCase): def setUp(self): # 插入你需要的测试数据,示例如下 ArrivalProbabilities.objects.create(binEntry=1.2, binEdge=0.5) ArrivalProbabilities.objects.create(binEntry=3.4, binEdge=1.0) # 可以按你的业务需求插入多条数据 def test_get_queryset_test(self): # 原有测试逻辑不变 ...
如果你之前手动造数据不生效,大概率是你把数据插到了本地业务库,而不是临时测试库,用以上两种方式可以解决该问题。
内容的提问来源于stack exchange,提问作者Brocolli_Highkicks
相关产品推荐
相关产品推荐

