Как проще всего сделать manage.py test app.TestCase снова работать после замены tests.py на test / directory? - PullRequest
3 голосов
/ 14 июля 2011

Я заменил project/app/tests.py на каталог project/app/tests/.Каталог содержит несколько файлов Python (назовите их apples.py, bananas.py и т. Д.), Каждый из которых определяет один или несколько классов, производных от TestCase (назовите их TestApples, TestBananas и т. Д.).Файл project/app/tests/__init__.py содержит

from apples import TestApples
from bananas import TestBananas

Команда manage.py test app все еще работает, но manage.py test app.bananas и manage.py test app.tests.bananas нет, например:

ValueError: Test label 'app.bananas' does not refer to a test

manage.py test app.tests.bananas не удается выполнить ста же ошибка, но manage.py test app.tests.bananas.TestBananas более обнадеживающий:

ValueError: Test label 'store.tests.bananas.TestBananas' should be of the form app.TestCase or app.TestCase.test_method

Документы Django и Документы Python предполагают, что решение состоит в том, чтобы написать пользовательский тестовый прогон или сборщик тестов и подключить егов; этот вопрос StackOverflow идет по тому же маршруту, а затем, кажется, рекомендует переключиться на django-nose.Я бы предпочел не делать этого, если мне не нужно, и мне любопытно посмотреть, как заставить это работать с помощью стандартных инструментов Django.У кого-нибудь есть простое (ish) решение?

Ответы [ 4 ]

2 голосов
/ 14 марта 2013

В вашем примере, если вы запустите manage.py test app.TestBananas, вы можете запустить этот конкретный тест.

Вы можете заставить все работать, убедившись, что все ваши тесты импортированы в __init__.py, но когда у вас много тестов, это становится сложным для управления. Если вы хотите запустить тесты в PyCharm, тогда django-nose не вариант.

Чтобы сделать это проще, мы можем сделать так, чтобы набор тестов автоматически находил все тесты в пакете тестов. Просто введите это в __init__.py (Обязательно замените «appname»):

def suite():   
    return unittest.TestLoader().discover("appname.tests", pattern="*.py")

Это по-прежнему не позволяет нам запускать определенные тесты. Для этого вам нужно добавить этот код вверху __init__.py:

import pkgutil
import unittest

for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
    module = loader.find_module(module_name).load_module(module_name)
    for name in dir(module):
        obj = getattr(module, name)
        if isinstance(obj, type) and issubclass(obj, unittest.case.TestCase):
            exec ('%s = obj' % obj.__name__)

Теперь вы можете запускать все свои тесты через manage.py test app или через определенные тесты через manage.py test app.TestApples

2 голосов
/ 14 июля 2011

Я просто делаю этот урок .

Редактировать: после django 1.6 механизм обнаружения тестов изменился. Вам просто нужно создать папку tests с файлом __init__.py внутри и поместить туда свои тестовые файлы. Ваши тестовые файлы должны соответствовать шаблону test*.py.

0 голосов
/ 15 июля 2011

Вы пытались переименовать свои тестовые файлы, например, в "test_foo.py" вместо "foo.py"?

0 голосов
/ 14 июля 2011

Я использую Джанго-нос ! Не бойся посылок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...