Запустите тесты Django с тестами носа

Тестирование моих приложений на Python выполняется на удаленном сервере с помощью команды nosetests, Я не могу изменить способ запуска тестов и не могу добавить к нему опции. У меня есть приложение Django с тестами, но тесты не работают должным образом.

Структура моего проекта:

project
├── README.md
├── setup.py
├── mysite
│   ├── blog
│   │   ├── __init__.py
│   │   ├── models.py
│   │   ├── tests.py
|   |   ├── ...
│   ├── db.sqlite3
│   ├── manage.py
│   ├── mysite
│   │   ├── __init__.py
│   │   ├── settings.py
|   |   ├── ...

команда nosetests выполнен в project каталог. Я хочу чтобы он правильно запускался tests.py который имеет 2 тестовых случая Django. Я пытался создать tests каталог в корне проекта и вызывать тесты с DiscoverRunner):

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
test_dir = os.path.dirname(os.path.dirname(__file__)) # one level up
sys.path.insert(0, os.path.join(test_dir, 'mysite'))

class ServerTest(unittest.TestCase):
    def test_runtests(self):
        django.setup()
        self.test_runner = DiscoverRunner(verbosity=1, interactive=True, failfast=False)
        failures = self.test_runner.run_tests(['mysite'])
        self.assertEqual(failures, 0)

Это работает, но проблема в том, что все тесты рассматриваются как один тест, и сервер создает неправильные отчеты.

Другое решение: если я добавлю пустое __init__.py в project/mysite обнаруживает нос tests.py но тесты провалились, потому что 'Apps are not loaded yet' что, вероятно, означает, что я должен призвать django.setup() раньше, но я не знаю, как это сделать. Я нашел плагин для носа, который делает это, но я не могу установить плагины или изменить параметры на удаленной машине.

Любые идеи, как заставить любой из моих подходов решить проблему?

2 ответа

Решение

Прежде всего, вы должны установить и настроить django-nose если вы еще этого не сделали:

pip install django-nose

Затем добавьте его на свой INSTALLED_APPS:

INSTALLED_APPS = (
    ...
    'django_nose'
)

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'  

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

project
├── mysite
│   ├── blog
│   │   ├── __init__.py
│   │   ├── models.py
|   |   ├── ...
│   ├── mysite
│   │   ├── __init__.py
│   │   ├── settings.py
|   |   ├── ...
│   ├── tests
│   │   ├── __init__.py
│   │   ├── test_a_whole_class_of_methods.py  
│   │   ├── test_a_whole_view.py  
│   │   ├── test_one_of_my_methods.py
│   │   ├── test_another_one_of_my_methods.py  
|   |   ├── ...
│   ├── db.sqlite3
│   ├── manage.py
├── README.md
├── setup.py

НЕ ЗАБУДЬТЕ __init__.py ФАЙЛ ВНУТРИ tests FOLDER!!!

Теперь, когда вы бежите nosetests из корня вашего проекта, он будет запускать каждый тест в tests папка:

~ $ cd path/to/project
path/to/project $ nosetests

Поскольку вы можете добавлять файлы в корневой каталог вашего проекта, вы можете попробовать добавить setup.cfg там файл, который будет искать нос при выполнении, и в нем укажите, где искать тесты:

# setup.cfg
[nosetests]
where=mysite/blog/

(Смотрите документацию, какие параметры вы можете указать здесь).

Я не уверен, что это сработает (возможно, команда, которая запускает nose, уже указала другой файл конфигурации для использования), но, похоже, стоит попробовать.

Другие вопросы по тегам