Как я могу описать 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