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

Django单元测试测试数据库交互异常问题求助

Django单元测试数据库数据读不到?试试这几个排查点

1. 先确认测试类的基类是不是对的

必须继承django.test.TestCase,不能用原生的unittest.TestCase。前者会自动帮你管理测试数据库的事务——每次测试前创建干净的测试库,测试完自动回滚/销毁,而原生unittest基类不会触发Django的测试数据库上下文,导致你连到了真实数据库。

正确示例:

from django.test import TestCase
from .models import Animal

class AnimalTest(TestCase):
    def setUp(self):
        Animal.objects.create(name="lion")
        Animal.objects.create(name="cat")
    
    def test_print_animals(self):
        animals = Animal.objects.all()
        print([a.name for a in animals])  # 这里该输出lion和cat

2. 检查override_settings的用法

别直接在settings.py里瞎改测试数据库配置,要么用装饰器/上下文管理器包裹测试类,要么在settings的数据库配置里加TEST节点:

方式一:用装饰器临时覆盖

from django.test import TestCase, override_settings

@override_settings(
    DATABASES={
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': ':memory:',  # 内存库,测试完自动销毁,干净省心
        }
    }
)
class AnimalTest(TestCase):
    # 你的测试代码

方式二:在settings.py里配置测试库

# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 比如你用MySQL
        'NAME': 'my_prod_db', # 生产库名
        # 其他生产配置...
        'TEST': {
            'NAME': 'my_test_db', # 测试时自动创建这个库
        }
    }
}

3. 用对coverage的启动命令

别直接跑coverage run test.py,要通过Django的test命令启动coverage,这样才能确保加载Django的测试环境:

coverage run manage.py test your_app_name.tests

4. 清理旧的测试数据库

如果之前用了--keepdb参数保留测试库,可能库里有脏数据。试试删了测试库重新跑:

# 以MySQL为例,先删测试库
mysql -u root -e "DROP DATABASE IF EXISTS my_test_db;"
# 或者直接让Django强制重建测试库
python manage.py test --noinput --keepdb=False

5. 别绕开Django的ORM操作数据库

如果你的代码里有手动创建数据库连接、用第三方ORM的情况,可能跳过了Django的测试数据库管理逻辑。所有数据库操作都要通过Django的models API来做,别自己搞连接。

内容的提问来源于stack exchange,提问作者Keiru Dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 01:40:01