我希望能够从Visual Studio Code中运行和调试Django项目的单元测试。我是一位经验丰富的开发人员,但是对Django和Visual Studio Code还是相当陌生。
问题的症结在于,这些测试要么无法在Visual Studio Code中发现,要么可以被发现,因此在运行它们时会出现ConnectionHandler异常。我在下面提供了这两种情况的详细信息。
对于这个问题的篇幅,我深表歉意,但是我认为我应该列出针对我未成功尝试的问题的许多解决方案。我还认为,将它们全部放在一个位置可能比将它们分散在StackOverflow和Internet的其余部分上有用。
迄今为止最好的解决方案
我发现的最佳解决方案是Visual Studio Code下的Django应用程序单元测试问题。它涉及将以下四行放入__init__.py文件中:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_app_project.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
这在我下面描述的简单教程项目中有效,但是在实际应用程序中,某些测试失败。看起来好像Django没有将数据库模型与其他测试隔离开来运行,或者好像没有调用测试的tearDown()方法。另外,不清楚要在哪个__init__.py文件中放入这些行。最后,此解决方案导致从命令行运行时单元测试失败。
其他解决方案
运行Django测试时,如何解决“ TypeError:类型'ConnectionHandler'的参数不可迭代”的StackOverflow问题?似乎与我的问题的ConnectionHandler方面相似,但是没有人提出解决方案。
我找到了应该解决以下问题的Visual Studio Code扩展:Django Test Runner(https://marketplace.visualstudio.com/items?itemName=Pachwenko.django-test-runner)。目前在https://github.com/Pachwenko/VSCode-Django-Test-Runner/issues/5中存在一个问题,该问题描述了我的扩展程序存在的问题。
该博客说,您可以使用pytest在VSC中运行Django单元测试:https ://technowhisp.com/django-unit-testing-in-vscode/ 。但是即使仔细遵循了他的步骤,我也无法让pytest在Visual Studio Code中发现单元测试。
在Visual Studio 2017或2019的Django单元测试中的StackOverflow问题:没有答案。发问者提供的部分解决方案代码丑陋且肿。该问题被标记为可能在Visual Studio 2017或2019中进行Django单元测试的重复项:,但该问题也没有答案。关于StackOverflow的其他问题与Django甚至Python都不相关。
我的设定
该问题的其余部分描述了我的环境以及所遇到问题的确切性质。我正在使用现有应用程序,但已设法在两个教程项目上重现该问题-Django团队在https://docs.djangoproject.com/en上的“编写第一个Django应用程序”在线教程中提供了该项目。/3.0/intro/,以及Visual Studio Code团队在https://code.visualstudio.com/docs/python/tutorial-django提供的第二个教程。从结构上讲,两个项目之间的区别在于,第二个项目在与项目根目录相同的目录中具有manage.py脚本,而第一个项目在项目根目录下具有一个目录的脚本。
我可以从命令行毫无问题地运行测试。我希望能够在Visual Studio Code中运行它们,因为有时我想通过调试器运行它们。
我正在使用python 3.7,Django 3.0.3,Visual Studio Code 1.42.1,Windows 10,适用于Linux的Windows子系统和unittest框架。
对于我的项目,我将描述第一个教程的设置,因为这与我的真实项目的设置方式最为相似。根目录称为mysite。该tree
命令的清理输出显示以下内容:
.
└── mysite
├── db.sqlite3
├── manage.py
├── mysite
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── polls
├── __init__.py
├── admin.py
├── apps.py
├── migrations
├── models.py
├── mydate.py
├── tests.py
├── urls.py
└── views.py
这是我的VSC settings.json文件:
{
"python.pythonPath": "venv/bin/python",
"python.testing.unittestArgs": [
"-v",
"-s",
// "/full/path/to/mysite",
"./mysite",
// "mysite",
"-p",
"test*.py"
],
"python.testing.pytestEnabled": false,
"python.testing.nosetestsEnabled": false,
"python.testing.unittestEnabled": true
}
该文件显示在“ -s”参数后注释掉的两行。无论我使用这三行中的哪一行,我都将得到相同的行为。
VSC中的ConnectionHandler错误
在Visual Studio Code中,我的polls / tests.py文件如下所示:
如您所见,“运行测试”和“调试测试”按钮表明该测试是可发现的。使用unittest导入,测试可以在VSC内正常运行,但是使用django.test导入,我将收到一个ConnectionHandler错误,并带有以下消息堆栈:
======================================================================
ERROR: setUpClass (polls.tests.TestDjango)----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/jkurlandski/workspace/randd/djangoprojs/mysite/venv/lib/python3.7/site-packages/django/test/testcases.py", line 1123, in setUpClass super().setUpClass()
File "/home/jkurlandski/workspace/randd/djangoprojs/mysite/venv/lib/python3.7/site-packages/django/test/testcases.py", line 197, in setUpClass cls._add_databases_failures()
File "/home/jkurlandski/workspace/randd/djangoprojs/mysite/venv/lib/python3.7/site-packages/django/test/testcases.py", line 218, in _add_databases_failures cls.databases = cls._validate_databases() File "/home/jkurlandski/workspace/randd/djangoprojs/mysite/venv/lib/python3.7/site-packages/django/test/testcases.py", line 204, in _validate_databases if alias not in connections:
TypeError: argument of type 'ConnectionHandler' is not iterable
----------------------------------------------------------------------
Ran 0 tests in 0.001s
VSC中的导入问题
在mysite / mysite / polls / models.py中,我创建了与上述Django教程中所述的相同的Question和Choice模型。但是,当我尝试导入它们时,这些测试将不再可被发现-VSC中的“运行”和“调试”按钮消失了,并且我收到一条消息,指出它们不可被发现。
from django.test import TestCase
# from unittest import TestCase
# not discoverable:
# from .models import Choice
# not discoverable:
# from polls.models import Choice
在VSC中,使用from polls.models import Choice
会创建“未解决的导入'polls.models'警告,并使导入语句用黄色下划线。from .models import Choice
导入不会引起警告。由于无法发现测试,因此无法运行它,或者在VSC内对其进行调试。(但请注意,正如我所说,从命令行可以正确运行测试。)
作为实验,我在民意测验中创建了文件mydate.py,该文件与models.py处于同一目录,其中包含一个名为getNow()的函数。我可以将该文件导入到tests.py中,而不会失去测试的可发现性,但是运行测试会导致上述相同的ConnectionHandler错误。
from django.test import TestCase
# from unittest import TestCase
# discoverable, but TypeError: argument of type 'ConnectionHandler' is not iterable:
from polls.mydate import getNow
# discoverable, but TypeError: argument of type 'ConnectionHandler' is not iterable:
# from .mydate import getNow
命令行中的ConnectionHandler错误
就像我说过的那样,我可以使用从命令行运行单元测试python manage.py test
。但是,我可以通过python -m unittest
从manage.py目录运行来复制ConnectionHandler错误。
预先感谢你们能给我的任何帮助。
您需要先加载django配置才能运行任何测试,因此__init__.py
文件中的代码也是如此。
如果pytest
是你的选择,你必须安装pytest
和pytest-django
pip install pytest pytest-django
在具有以下内容的文件的同一级别上创建pytest
配置(例如:)。pytest.ini
manage.py
[pytest]
DJANGO_SETTINGS_MODULE=mysite.settings
python_files=test*.py
该配置DJANGO_SETTINGS_MODULE
是项目设置(settings.py
文件)所需的导入。默认情况下,tests.py
使用时会为每个应用程序创建文件python manage.py startapp app_name
,但是该文件与默认pytest
文件模式不匹配,因此,python_files
如果要使用默认文件名,则必须添加选项。
使用以下命令更新setting.json
配置文件:
{
"python.pythonPath": "venv/bin/python",
"python.testing.pytestArgs": [
"mysite",
"-s",
"-vv"
],
"python.testing.pytestEnabled": true,
"python.testing.nosetestsEnabled": false,
"python.testing.unittestEnabled": false
}
关于该错误unresolved import 'polls.models'
,您需要在VSCode上配置Python扩展名,以.env
在项目的根目录中创建一个文件PYTHONPATH=source_code_folder
(有关VS Code Python Environment的更多信息):
PYTHONPATH=mysite/
最后,您的项目结构应为
. <-- vs code root
├── .env <-- file created with the PYTHONPATH entry
└── mysite
├── pytest.ini <-- pytest configuration
├── db.sqlite3
├── manage.py
├── mysite
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── polls
├── __init__.py
├── admin.py
├── apps.py
├── migrations
├── models.py
├── mydate.py
├── tests.py
├── urls.py
└── views.py
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句