Как я могу описать django-нос, где мои тесты?
У меня есть мои тесты для приложения Django в каталоге тестов:
my_project/apps/my_app/
├── __init__.py
├── tests
│ ├── __init__.py
│ ├── field_tests.py
│ └── storage_tests.py
├── urls.py
├── utils.py
└── views.py
Тестер Django требует, чтобы я поместил функцию suite() в файл __init__.py
моего каталога приложений. Эта функция возвращает те тесты, которые будут выполняться, когда я это сделаю
$ python manage.py test
Я установил django-нос. Когда я пытаюсь запустить тесты с django-носом, запускаются 0 тестов:
$ python manage.py test <app_name>
Если я указываю непосредственно на тестовом модуле, тесты выполняются:
$ python manage.py test my_project.apps.my_app.tests.storage_tests
Почему django-нос тест-бегун не найти мои тесты? Что я должен делать?
Ответы
Ответ 1
Если вы используете django-нос, вы можете использовать простой селектор:
from nose.selector import Selector
from nose.plugins import Plugin
import os
import django.test
class TestDiscoverySelector(Selector):
def wantDirectory(self, dirname):
parts = dirname.split(os.path.sep)
return 'my_app' in parts
def wantClass(self, cls):
return issubclass(cls, django.test.TestCase)
def wantFile(self, filename):
parts = filename.split(os.path.sep)
return 'test' in parts and filename.endswith('.py')
def wantModule(self, module):
parts = module.__name__.split('.')
return 'test' in parts
class TestDiscoveryPlugin(Plugin):
enabled = True
def configure(self, options, conf):
pass
def prepareTestLoader(self, loader):
loader.selector = TestDiscoverySelector(loader.config)
Это всего лишь пример реализации, и вы можете сделать его более настраиваемым или настроить в соответствии с вашими потребностями. Чтобы использовать его в своем проекте Django, просто укажите в файле settings.py
следующую опцию:
NOSE_PLUGINS = ['lorepo.utility.noseplugins.TestDiscoveryPlugin']
Ответ 2
Неправильно:
python manage.py test my_app.tests.storage_tests:TestCase.test_name
на самом деле с косой чертой до имени класса и с расширением файла
Справа:
python manage.py test my_app/tests/storage_tests.py:TestCase.test_name
Ответ 3
нос автоматически выбирается, если вы добавите test= True в начале модуля и если ваши методы начинаются с test_
посмотреть, как нос обнаруживает тесты http://nose.readthedocs.io/en/latest/finding_tests.html
Ответ 4
Я столкнулся с этой же ситуацией. С помощью пакета он позволит вам запускать все тесты или тесты для приложения, но не конкретный тестовый пример или конкретный тест.
Это довольно взломанно, но то, что я сделал, чтобы обойти это, вместо того, чтобы определять набор в __init__.py
, это просто import *
из всех других тестовых модулей, он отстой, но он работает.
Есть несколько вещей, которые я делаю, чтобы помочь убедиться, что я не заканчиваю сближение наборов тестов в других модулях... объявляет __all__
в каждом тестовом модуле, поэтому только имена тестов импортируются с помощью * и сохранить pylint работает. Я получаю уведомление о переопределении имени класса.
Сказав, что вы сможете заставить это работать без уродливого дерьма import *
... Я не использую нос и джанго-нос... (который я намереваюсь исправить очень скоро)... поскольку это то, что вы делаете, похоже, что вы можете сделать это, чтобы запустить все тесты в вашем каталоге приложений:
python manage.py test apps
или выполнить все тесты для одного тестового модуля:
python manage.py test apps.my_app.tests.storage_tests
Уведомление Я не включил проект в предыдущий пример... который, казалось, работал отлично для меня, используя носеты и django-нос.
Кроме того, для запуска определенного набора тестов вы можете сделать это:
python manage.py test apps.my_app.tests.storage_tests:TestCase
Или запустить один конкретный тест:
python manage.py test apps.my_app.tests.storage_tests:TestCase.test_name
Ответ 5
Чтобы понять, где ваши приложения добавляют их в начало manage.py
import os, site
ROOT = os.path.dirname(os.path.abspath(__file__))
path = lambda *a: os.path.join(ROOT, *a)
site.addsitedir(path('apps'))
С тех пор вы можете использовать
python manage.py test my_app.tests.storage_tests: TestCase.test_name