Не удается отладить модульные тесты Django в коде Visual Studio - PullRequest
1 голос
/ 25 февраля 2020

Я хочу иметь возможность запускать и отлаживать модульные тесты для проекта Django из кода Visual Studio. Я опытный разработчик, но довольно плохо знаком с Django и Visual Studio Code.

Суть проблемы в том, что либо тесты невозможно обнаружить в коде Visual Studio, либо, если они обнаружимы, я получаю исключение ConnectionHandler при запуске. Я предоставляю подробности для обеих этих ситуаций ниже.

Я прошу прощения за длину этого вопроса, но я подумал, что должен перечислить множество решений проблемы, которые я попытался безуспешно. Я также думаю, что было бы полезно собрать их все в одном месте, а не разбросать их по всему StackOverflow и остальной части Inte rnet.

Лучшее решение на данный момент

Лучшее решение, которое я нашел, это Проблема с Django модульными тестами приложения в 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 помещать эти строки. Наконец, это решение приводит к сбою модульных тестов при запуске из командной строки.

Попытка других решений

Вопрос StackOverflow на Как исправить «TypeError: аргумент типа« ConnectionHandler »не повторяется» при выполнении теста django? похоже на аспект ConnectionHandler моей проблемы, но никто не предлагал решения там.

Я нашел расширение кода Visual Studio, которое должно решить эти проблемы: Django Runner (https://marketplace.visualstudio.com/items?itemName=Pachwenko.django-test-runner). В настоящее время существует проблема в https://github.com/Pachwenko/VSCode-Django-Test-Runner/issues/5, которая описывает проблему, с которой я столкнулся с расширением.

В этом блоге говорится, что вы можете запускать Django модульные тесты в VS C с pytest: https://technowhisp.com/django-unit-testing-in-vscode/. Но даже после тщательного выполнения его шагов я не могу заставить pytest обнаружить модульные тесты в коде Visual Studio.

Вопрос StackOverflow на Django Модульное тестирование в Visual Studio 2017 или 2019: не имеет ответа. Код, который спрашивающий представляет как частичное решение, уродлив и раздут. Вопрос помечен как возможный дубликат Django Модульное тестирование в Visual Studio 2017 или 2019: , но на этот вопрос также нет ответа. Другие вопросы по StackOverflow не связаны с Django или даже Python.

My Setup

Остальная часть этого вопроса описывает мою среду и точную природу из проблем, которые я имею. Я работаю с существующим приложением, но мне удалось воспроизвести проблему в двух проектах учебника - один из них, предоставленный командой Django в их онлайн-учебнике «Написание своего первого Django приложения» по адресу https://docs.djangoproject.com/en/3.0/intro/, и второе руководство, предлагаемое командой разработчиков Visual Studio по адресу https://code.visualstudio.com/docs/python/tutorial-django. Конструктивно разница между этими двумя проектами заключается в том, что у второго сценарий manage.py находится в том же каталоге, что и у проекта root, а у первого проекта - сценарий на один каталог ниже проекта root.

Я могу запустить тесты из командной строки без проблем. Я хочу иметь возможность запускать их из кода Visual Studio, потому что иногда я хочу запускать их через отладчик.

Я использую python 3.7, Django 3.0.3, код Visual Studio 1.42.1, Windows 10, подсистема Windows для Linux и инфраструктура unittest.

Что касается моего проекта, я опишу настройку для первого урока, так как он наиболее похож на как устроен мой настоящий проект. Каталог root называется 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

Вот мои настройки VS C. 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". Я получаю одно и то же поведение независимо от того, какую из этих трех строк я использую для пути.

Ошибка ConnectionHandler в VS C

В коде Visual Studio мои опросы Файл /tests.py выглядит следующим образом:

enter image description here

Как видите, кнопки «Run Test» и «Debug Test» показывают, что тест обнаруживаемый. При импорте unittest тест выполняется правильно в VS C, но при импорте 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

Проблемы с импортом внутри VS C

В mysite / mysite / polls / models.py я создал те же модели Вопроса и Выбора, которые описаны в учебнике Django, указанном выше. Однако, когда я пытаюсь импортировать их, тесты больше не обнаруживаются - кнопки «Выполнить» и «Отладка» исчезают в VS C, и я получаю сообщение о том, что они не доступны для обнаружения.

from django.test import TestCase
# from unittest import TestCase

# not discoverable:
# from .models import Choice
# not discoverable: 
# from polls.models import Choice

В VS C использование from polls.models import Choice создает предупреждение «неразрешенный импорт» polls.models 'и приводит к тому, что оператор импорта становится подчеркнутым желтым. Импорт from .models import Choice не вызывает предупреждение. Тест не обнаруживается. Я не могу его запустить или отладить в VS C. (Но обратите внимание, как я уже сказал, что из командной строки тест выполняется правильно.)

Как В ходе эксперимента я создал файл 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 из командной строки

Как я уже говорил, я могу запускать модульные тесты из командной строки с помощью * 1 102 *. Однако я могу повторить ошибку ConnectionHandler, запустив python -m unittest из каталога manage.py.

Заранее благодарен за любую помощь, которую вы, ребята, можете мне дать.

...