无法在Visual Studio Code中调试Django单元测试

杰里·K

我希望能够从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错误

预先感谢你们能给我的任何帮助。

Motakjuq

您需要先加载django配置才能运行任何测试,因此__init__.py文件中的代码也是如此

如果pytest是你的选择,你必须安装pytestpytest-django

pip install pytest pytest-django
  1. 具有以下内容文件的同一级别上创建pytest配置(例如:)pytest.inimanage.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如果要使用默认文件名,则必须添加选项。

  2. 使用以下命令更新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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在 Visual Studio Code 中调试 MSTest 单元测试

如何在Visual Studio中调试TypeScript单元测试?

节点工具Visual Studio(NTVS)中的调试单元测试

在Visual Studio代码中调试MSTest单元测试

Visual Studio for Mac调试单元测试

无法在Visual Studio 2017 Professional中运行单元测试

无法在Visual Studio 2015中运行任何单元测试

如何从Visual Studio Code中使用Mocha调试用Typescript编写的单元测试

如何在Visual Studio 2017 Mac中调试.NET Core /标准单元测试?

Visual Studio Express 2013:单元测试中的程序输出(控制台,调试等)

Python单元测试:在Visual Studio Code中未发现测试

Visual Studio 2015或2017无法发现单元测试

Visual Studio 实时单元测试无法正常工作

在Visual Studio / Resharper中以调试模式运行单元测试时出现“不确定:测试未运行”错误

在Visual Studio Code中调试Go测试

在Visual Studio Code中调试Cypress测试

无法在Visual Studio 2017中建立我的单元测试项目

Visual Studio Code C ++单元测试是否覆盖?

用Visual Studio Code编写单元测试

从Visual Studio Code运行所有Flutter单元测试

单元测试在运行时可以正常运行,但在Android Studio 4.1中调试时无法正常运行

将单元测试数据附加到Visual Studio中的单元测试

在Visual Studio本机单元测试中,是否可以将单元测试耦合到项目?

在Visual Studio 2019中未发现的单元测试

Visual Studio 2017中的Xamarin(Android)单元测试

通过TFS在Visual Studio中运行Jasmine单元测试

无法在Pycharm中调试单元测试

Visual Studio 2019 - 无法运行 Python 单元测试 - 无法导入测试模块:

无法在Visual Studio 2013中使用断点调试测试