PyCharm中运行带Coverage的Django测试报TypeError问题求助
PyCharm中Django项目带Coverage测试报错的解决方案
报错信息
Traceback (most recent call last): File "C:\Program Files\JetBrains\PyCharm 2023.1.2\plugins\python\helpers\pycharm\django_test_manage.py", line 6, in <module> from django.core.management import ManagementUtility File "C:\Users\User\Project\Code\venv39-master\lib\site-packages\django\core\management\__init__.py", line 13, in <module> from django.apps import apps File "C:\Users\User\Project\Code\venv39-master\lib\site-packages\django\apps\__init__.py", line 1, in <module> from .config import AppConfig File "C:\Users\User\Project\Code\venv39-master\lib\site-packages\django\apps\config.py", line 7, in <module> from django.utils.deprecation import RemovedInDjango41Warning File "C:\Users\User\Project\Code\venv39-master\lib\site-packages\django\utils\deprecation.py", line 5, in <module> from asgiref.sync import sync_to_async File "C:\Users\User\Project\Code\venv39-master\lib\site-packages\asgiref\sync.py", line 130, in <module> class AsyncToSync(Generic[_P, _R]): File "C:\Program Files\Python39\lib\typing.py", line 277, in inner return func(*args, **kwds) File "C:\Program Files\Python39\lib\typing.py", line 997, in __class_getitem__ raise TypeError( TypeError: Parameters to Generic[...] must all be type variables
测试代码
class SimpleTest(TestCase): def test_basic_addition(self): self.assertEqual(1 + 1, 2)
当前环境版本
- Python 3.9.13
- Django 3.2.20
- asgiref 3.7.2
- typing_extensions 4.8.0
异常现象
在终端使用以下命令运行测试完全正常:
coverage run ./manage.py test -v 3
但在PyCharm IDE中运行带Coverage的测试时触发上述报错,且JetBrains说明PyCharm使用的是相同的Coverage库。
Coverage系统信息
% coverage debug sys -- sys ------------------------------------------------------- coverage_version: 7.3.2 coverage_module: C:\Users\User\Project\Code\venv39-master\lib\site-packages\coverage\__init__.py python: 3.9.13 (tags/v3.9.13:6de2ca5, May 17 2022, 16:36:42) [MSC v.1929 64 bit (AMD64)] platform: Windows-10-10.0.22621-SP0 implementation: CPython executable: C:\Users\User\Project\Code\venv39-master\Scripts\python.exe path: C:\Users\User\Project\Code\venv39-master\Scripts\coverage.exe C:\Program Files\Python39\python39.zip C:\Program Files\Python39\DLLs C:\Program Files\Python39\lib C:\Program Files\Python39 C:\Users\User\Project\Code\venv39-master C:\Users\User\Project\Code\venv39-master\lib\site-packages
解决方案
1. 降级asgiref到兼容Python3.9的版本
asgiref 3.7.x版本引入的泛型类型写法在Python3.9的原生typing模块中不兼容,需要降级到3.6.x版本:
pip install asgiref==3.6.0
该版本可与Python3.9、Django3.2.x完美适配,不会触发类型错误。
2. 检查PyCharm测试配置
- 打开PyCharm的Run/Debug Configurations,找到对应的测试配置
- 确认Python interpreter选择的是项目对应的虚拟环境(
venv39-master) - 勾选Emulate terminal in output console,让测试运行环境与终端保持一致
3. 禁用PyCharm的Django测试助手脚本
若降级asgiref无效,可尝试绕过PyCharm自带的测试助手:
- 在测试配置中,将Target改为直接运行
manage.py test,而非通过PyCharm的django_test_manage.py - 手动添加Coverage参数:在Script parameters中填入
test -v 3,然后在Before launch中添加Run External tool,选择Coverage并配置参数指向项目的manage.py
内容的提问来源于stack exchange,提问作者Jorge Miguel Soares Lopes
相关产品推荐
相关产品推荐

