Django 2.0单元测试因AppRegistryNotReady无法运行的问题求助
解决Django单元测试导入模型时的AppRegistryNotReady错误
嘿,我来帮你搞定这个Django测试的问题!你遇到的AppRegistryNotReady错误,根源是手动设置环境变量的时机不对,而且其实完全没必要这么做——Django的TestCase已经帮你处理好了环境初始化的工作。
问题出在哪?
你在测试类的定义里直接写了os.environ.setdefault(...),这行代码会在类被加载的瞬间执行,而此时Django还没完成应用注册表的初始化,紧接着导入模型(比如from polls.models import Question)自然就会触发报错。而且,TestCase本身就会自动配置Django环境,根本不需要你手动设置环境变量。
修正后的测试代码
把你的测试代码改成这样就没问题了:
from django.test import TestCase from polls.models import Question # 现在可以正常导入模型了 class FirstTest(TestCase): def test_First(self): a = 1 self.assertEqual(1, a) # 要是你需要测试模型功能,可以加个示例用例: def test_question_creation(self): question = Question.objects.create(question_text="测试问题", pub_date="2024-01-01") self.assertEqual(question.question_text, "测试问题")
正确的测试运行方式
别直接运行测试文件,在项目根目录下用Django官方的测试命令执行:
python manage.py test
这个命令会自动帮你初始化Django环境、加载所有应用配置,导入模型的操作自然就不会报错了。
额外小提示
- 测试文件最好放在对应app的
tests目录下(比如polls/tests/test_models.py或者直接polls/tests.py),这样Django的测试运行器能自动识别并执行它们。 - 如果你非得手动运行测试文件(非常不推荐),那得在导入任何Django模块前先完成Django初始化:
import os import django os.environ.setdefault("DJANGO_SETTINGS_MODULE", "testje.settings") django.setup() # 必须调用这行完成初始化 from django.test import TestCase from polls.models import Question class FirstTest(TestCase): def test_First(self): a = 1 self.assertEqual(1, a)
但还是强烈建议用python manage.py test的方式,这才是符合Django最佳实践的做法。
内容的提问来源于stack exchange,提问作者Martijn Kamstra
相关产品推荐
相关产品推荐

