Как я могу запустить юнит-тест django в VSCode? - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь запустить django unittest, используя VSCode, а не терминал.

дерево моего проекта выглядит следующим образом:

├── db.sqlite3
├── hero
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-37.pyc
│   │   ├── admin.cpython-37.pyc
│   │   ├── apps.cpython-37.pyc
│   │   ├── models.cpython-37.pyc
│   │   ├── tests.cpython-37.pyc
│   │   ├── urls.cpython-37.pyc
│   │   └── views.cpython-37.pyc
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── 0002_hero_age.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       ├── 0001_initial.cpython-37.pyc
│   │       ├── 0002_hero_age.cpython-37.pyc
│   │       └── __init__.cpython-37.pyc
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── manage.py
└── toh
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-37.pyc
    │   ├── settings.cpython-37.pyc
    │   ├── urls.cpython-37.pyc
    │   └── wsgi.cpython-37.pyc
    ├── settings.py
    ├── urls.py
    └── wsgi.py

Я создал файл tests.py внутри каталога hero.

Мой код tests.py выглядит следующим образом:

from django.test import TestCase, Client
from .models import Hero
# Create your tests here.
class HeroTestCase(TestCase):
    def setUp(self):
        Hero.objects.create(name='Superman', age=10)
        Hero.objects.create(name='Batman', age=1)
        Hero.objects.create(name='Ironman', age=30)

    def test_hero_count(self):
        self.assertEqual(Hero.objects.all().count(), 3)
    def test_hero_id(self):
        client=Client()
        response=client.get('/hero/1/')

        self.assertEqual(response.status_code, 200)
        self.assertIn('1', response.content.decode())
    def test_hero_visit_count(self):
        client = Client()
        response = client.get('/hero/hello')
        self.assertEqual(response.status_code, 200)
        self.assertIn('1', response.content.decode())
        response = client.get('/hero/hello')
        self.assertEqual(response.status_code, 200)
        self.assertIn('2', response.content.decode())

И мой .vscode / settings.json выглядит так:

{
    "python.pythonPath": "/anaconda3/bin/python",
    "python.linting.pylintEnabled": true,
    "python.linting.enabled": true,
    "python.testing.unittestArgs": [
        "-v",
        "-s",
        "./hero",
        "-p",
        "*test*.py"
    ],
    "python.testing.pytestEnabled": false,
    "python.testing.nosetestsEnabled": false,
    "python.testing.unittestEnabled": true
}

Но когда я запускаю тестирование по VSCode, эта ошибка продолжает появляться.

======================================================================
ERROR: tests (unittest.loader._FailedTest)
----------------------------------------------------------------------
ImportError: Failed to import test module: tests
Traceback (most recent call last):
  File "/anaconda3/lib/python3.7/unittest/loader.py", line 436, in _find_test_path
    module = self._get_module_from_name(name)
  File "/anaconda3/lib/python3.7/unittest/loader.py", line 377, in _get_module_from_name
    __import__(name)
  File "toh/hero/tests.py", line 2, in <module>
    from .models import Hero
ImportError: attempted relative import with no known parent package

Или:

django.core.exceptions.ImproperlyConfigured: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

Итак, я проверил, есть ли что-то не так с моим тестовым кодом, но мой тестовый код прошел, когда я запустил python manage.py test! Как мне решить эту проблему?

1 Ответ

0 голосов
/ 18 октября 2019

Относительная проблема импорта заключается в том, что вы установили -p на hero, который меняет каталог верхнего уровня на этот, и поэтому он больше не выглядит как пакет для Python.

Проблема конфигурации заключается в том, чтоunittest не работает manage.py. Вы можете перейти к https://github.com/microsoft/vscode-python/issues/73 и ? проблеме, чтобы проголосовать за то, чтобы она была приоритетной.

...