You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

  1. 先把本地业务库中你需要的表数据导出为fixture文件:
python manage.py dumpdata 你的APP名称.ArrivalProbabilities --output arrival_fixture.json
  1. 在你的APP目录下新建fixtures文件夹,把导出的arrival_fixture.json放到该文件夹内
  2. 在你的测试类上声明使用该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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:06:00