Django Channels异步测试被完全忽略问题求助
我之前在Django 2.x搭配Channels早期版本时,也碰到过一模一样的问题——复制了官方测试代码却完全跑不起来,只看到创建数据库的日志,测试根本没执行。这种情况通常出在几个容易被忽略的配置或命名细节上,咱们一步步排查:
1. 先检查测试文件的命名规范
Django的测试运行器只认以test_开头的文件,比如test_consumers.py。如果你的测试文件叫consumers_test.py或者其他不符合规则的名字,直接就会被跳过,这是最常见的坑。
2. 验证测试类和方法的命名
- 测试类必须以
Test开头,比如TestChatConsumer,而且要继承正确的基类——要么是django.test.TestCase,要么是Channels提供的channels.testing.WebsocketCommunicator相关测试类。 - 测试方法必须以
test_开头,比如test_websocket_connect_and_send。哪怕你完全复制了官方代码,要是方法名写成websocket_connect_test这种反着来的,测试运行器也会直接无视。
3. 确认Channels的测试配置是否到位
在Django 2.0 + Channels 2.0.2的环境下,settings.py里的CHANNEL_LAYERS必须配置测试可用的后端,推荐用内存层:
CHANNEL_LAYERS = { 'default': { 'BACKEND': 'channels.layers.InMemoryChannelLayer', 'TEST_CONFIG': { 'channels': ['test-channel'], }, }, }
同时要确保INSTALLED_APPS里已经添加了channels,不然测试模块可能无法正常加载。
4. 检查测试文件的存放位置
测试文件必须放在你的Django应用的tests目录下,或者直接放在应用根目录(同样要符合test_开头的命名规则)。如果把测试文件扔在项目根目录或者其他非应用目录,Django的测试发现机制根本找不到它。
5. 手动指定测试模块运行试试
如果自动发现测试有问题,你可以手动指定测试文件强制运行,比如:
python manage.py test myapp.tests.test_consumers
要是这样能正常执行测试,那肯定是自动发现的规则没满足,回头再核对文件名、路径和命名规范就行。
6. 确认依赖版本匹配
Channels 2.0.2对asgiref的版本有要求,建议检查一下你的依赖:
pip freeze | grep asgiref
对应Channels 2.0.2的asgiref版本应该在2.3.2左右,版本不匹配可能导致测试模块无法加载,进而被忽略。
我当初就是因为测试方法名没加test_前缀,折腾了好半天,你可以先从命名规范这种最基础的点排查,大概率能解决问题。
内容的提问来源于stack exchange,提问作者PyUnchained

