python 无法在Visual Studio代码中调试Django单元测试

lp0sw83n  于 2023-02-11  发布在  Python
关注(0)|答案(1)|浏览(172)

我希望能够在Visual Studio代码中运行和调试Django项目的单元测试。我是一个有经验的开发人员,但对Django和Visual Studio代码都相当陌生。
问题的症结在于,要么测试在Visual Studio代码中不可发现,要么即使可发现,在运行它们时也会收到ConnectionHandler异常。下面将提供这两种情况的详细信息。
我为这个问题的长度道歉,但是我想我应该列出我已经尝试过但没有成功的许多解决方案。我也认为把它们放在一个地方可能是有用的,而不是把它们分散在StackOverflow和互联网的其他地方。

迄今为止的最佳解决方案

我找到的最好的解决方案是Problem with Django app unit tests under Visual Studio Code,它包括将这四行代码放入一个__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文件。最后,此解决方案导致从命令行运行时单元测试失败。

尝试过的其他解决方案

How to fix "TypeError: argument of type 'ConnectionHandler' is not iterable" when running a django test?上的StackOverflow问题似乎与我的问题的ConnectionHandler方面类似,但没有人在那里提出解决方案。
我已经找到了一个Visual Studio代码扩展,应该解决这些问题:Django测试运行器(https://marketplace.visualstudio.com/items?itemName=Pachwenko.django-test-runner)。它目前在https://github.com/Pachwenko/VSCode-Django-Test-Runner/issues/5有一个问题,描述了我在扩展中遇到的问题。
这个博客说你可以用pytest在VSC中运行Django单元测试:但是,即使仔细按照他的步骤操作,我也无法让pytest发现Visual Studio Code中的单元测试。
Django Unit Testing in Visual Studio 2017 or 2019:上的StackOverflow问题没有答案。提问者提供的部分解决方案的代码丑陋而臃肿。这个问题被标记为可能与Django Unit Testing in Visual Studio 2017 or 2019:重复,但这个问题也没有答案。StackOverflow上的其他问题与Django甚至Python都无关。

我的设置

这个问题的其余部分描述了我的环境和我遇到的问题的确切性质。我正在使用一个现有的应用程序,但已经设法在两个教程项目中重现了这个问题-一个是Django团队在他们的“编写您的第一个Django应用程序”在线教程https://docs.djangoproject.com/en/3.0/intro/中提供的,另一个是Visual Studio Code团队在https://code.visualstudio.com/docs/python/tutorial-django中提供的。这两个项目之间的区别在于,第二个项目manage.py在与项目根相同的目录中具有www.example.com脚本,而第一个项目在项目根下的一个目录中具有脚本。
我能够从命令行运行测试,没有任何问题。我希望能够从Visual Studio代码中运行它们,因为有时我希望通过调试器运行它们。
我使用的是python 3.7、Django 3.0.3、Visual Studio代码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中的连接处理程序错误

在Visual Studio代码中,我的polls/tests.py文件如下所示:

正如你所看到的,“Run Test”和“Debug Test”按钮表示测试是可发现的。使用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/ www.example.com中models.py我创建了与前面Django教程中描述的相同的Question和Choice模型,但是当我尝试导入它们时,测试不再是可发现的--VSC中的“Run”和“Debug”按钮消失了,并且我收到一条消息说它们是不可发现的。

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会创建一个“unresolved import 'polls.models'警告,并导致import语句带有黄色下划线。from .models import Choice导入不会导致该警告。由于无法发现测试,因此我无法在VSC中运行或调试它。(但请注意,正如我所说的,从命令行可以正确运行测试。)
作为一个实验,我在polls中创建了文件mydate.py,与www.example.com相同的目录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从命令行运行单元测试,但是,我可以通过从www.example.com目录运行python -m unittest来复制ConnectionHandler错误manage.py。
先谢谢你们能给予我的帮助。

pbpqsu0x

pbpqsu0x1#

你需要在运行任何测试之前加载django配置,因此代码在__init__.py文件中。
如果您可以选择pytest,则必须安装pytestpytest-django

pip install pytest pytest-django

1.创建pytest配置(例如:pytest.ini),与manage.py文件处于同一级别,内容如下。

[pytest]
DJANGO_SETTINGS_MODULE=mysite.settings
python_files=test*.py

配置DJANGO_SETTINGS_MODULE是项目设置所需的导入(settings.py文件)。默认情况下,当您使用python manage.py startapp app_name时,会为每个应用创建tests.py文件,但此文件与默认的pytest文件模式不匹配,因此,如果您想使用默认文件名,则必须添加python_files选项。
1.使用以下内容更新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扩展,使用PYTHONPATH=source_code_folder在项目的根目录中创建一个.env文件(了解更多信息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

相关问题