Как мне узнать, где мои тесты? - PullRequest
15 голосов
/ 20 мая 2011

У меня есть тесты для приложения 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

Я установил Джанго-Нос. Когда я пытаюсь запустить тесты с django-nose, запускается 0 тестов:

$ python manage.py test <app_name>

Если я указываю прямо на тестовый модуль, тесты запускаются:

$ python manage.py test my_project.apps.my_app.tests.storage_tests

Почему тестировщик django-носа не находит мои тесты? Что я должен делать?

Ответы [ 5 ]

6 голосов
/ 23 февраля 2012

Если вы используете django-nose, вы можете использовать простой селектор:

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, просто укажите следующую опцию в settigs.py

NOSE_PLUGINS = ['lorepo.utility.noseplugins.TestDiscoveryPlugin']
4 голосов
/ 29 мая 2012

Неправильно:

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
0 голосов
/ 03 февраля 2017
Нос

будет выбран автоматически, если вы добавите test = True в начале модуля и если ваши методы начинаются с test_

посмотрите, как нос обнаруживает тесты http://nose.readthedocs.io/en/latest/finding_tests.html

0 голосов
/ 20 декабря 2011

Чтобы понять, где находятся ваши приложения, добавьте их в топ 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

0 голосов
/ 22 мая 2011

Я тоже столкнулся с такой же ситуацией. Используя пакет, вы сможете запускать все тесты или тесты для приложения, но не для конкретного теста или конкретного теста.

Это довольно глупо, но я решил обойти это вместо определения набора в __init__.py, который заключается в том, чтобы просто import * из всех других тестовых модулей, это отстой, но это работает.

Есть несколько вещей, которые я делаю, чтобы убедиться, что я не заканчиваю сгущать наборы тестов в других модулях ... __all__ объявлено в каждом тестовом модуле, поэтому только имена тестов импортируются с * и продолжайте работать Pylint, я уведомлен о переопределениях имени класса.

Сказав, что вы должны иметь возможность заставить это работать без всякой уродливой import * хрени ... Я не использую нос и django-нос ... (который я собираюсь исправить очень скоро) ... так как это то, что вы делаете, похоже, вы можете сделать это, чтобы запустить все тесты в вашем каталоге приложений:

python manage.py test apps

или для запуска всех тестов для одного тестового модуля:

python manage.py test apps.my_app.tests.storage_tests

обратите внимание, что я не включил проект в предыдущий пример ... который, как мне показалось, работал нормально с использованием тестов носа и django-nose.

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

python manage.py test apps.my_app.tests.storage_tests:TestCase

Или для запуска одного конкретного теста:

python manage.py test apps.my_app.tests.storage_tests:TestCase.test_name
...