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
相关产品推荐
相关产品推荐

