添加package fixtures后Django测试(nose)陷入停滞问题求助
解决Django测试添加Package Fixtures后
manage.py test停滞的问题 这种情况我之前碰到过好几次,核心原因是Django默认测试运行器不识别Nose专属的package fixture机制——你用python manage.py test时,调用的是Django自带的测试runner,它根本不知道setup_package()/teardown_package()这些函数是干嘛的,哪怕是空实现,也可能触发内部的无意义等待逻辑,导致终端停滞。
给你几个可行的解决方案:
1. 直接用Nose命令运行测试
既然你的fixture是为Nose设计的,直接跳过Django的runner,用Nose本身来执行测试:
nosetests myapp
这样Nose会正确处理package级别的fixture,不会出现停滞问题,这也是最直接的解决方式。
2. 配置Django使用Nose作为测试runner
如果一定要保留python manage.py test的调用方式,可以把Nose集成到Django的测试流程里:
- 先安装
django-nose包:pip install django-nose - 在项目的
settings.py中修改测试runner配置:TEST_RUNNER = 'django_nose.NoseTestSuiteRunner' - 之后再运行
python manage.py test myapp,Django会调用Nose的runner来执行测试,自然能正确识别package fixture。
3. 改用Django原生支持的全局fixture方式
如果不想依赖Nose,也可以把package级别的fixture逻辑迁移到Django测试框架支持的写法上,比如用测试基类的类级setup/teardown:
from django.test import TestCase class MyAppBaseTestCase(TestCase): @classmethod def setUpClass(cls): super().setUpClass() # 原来setup_package中的初始化逻辑写在这里 pass @classmethod def tearDownClass(cls): # 原来teardown_package中的清理逻辑写在这里 pass super().tearDownClass()
然后让你所有的测试类都继承这个MyAppBaseTestCase,就能实现和package fixture类似的全局初始化/清理效果,而且这种写法在Django默认runner下完全兼容,不会出现停滞问题。
内容的提问来源于stack exchange,提问作者Xiaochen Cui
相关产品推荐
相关产品推荐

