Я хочу иметь возможность запускать и отлаживать модульные тесты для проекта 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 выглядит следующим образом:
Как видите, кнопки «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.
Заранее благодарен за любую помощь, которую вы, ребята, можете мне дать.