Как распространить модульные тесты Django на несколько файлов? - PullRequest
115 голосов
/ 06 июня 2011

Сейчас ..

  • Файл tests.py довольнобольшой / сложный / грязный
  • Я бы хотел разбить tests.py на более мелкие наборы тестов ...

Как?

Ответы [ 9 ]

115 голосов
/ 06 июня 2011

Обратите внимание, что этот подход больше не действует в Django 1.6, см. Эту запись .

Вы можете создать папку tests с ___init___.py внутри (так что это становится пакетом).Затем вы добавляете туда свои файлы .py теста разделения и импортируете их все в ___init___.py.

Т.е.: замените файл test.py модулем, который выглядит и действует как файл:

Создайте tests Каталог под соответствующим приложением

app
app\models.py
app\views.py
app\tests
app\tests\__init__.py
app\tests\bananas.py
app\tests\apples.py

Импортируйте подмодули в app\tests\__init__.py:

from bananas import *
from apples import *

Теперь вы можете использовать ./manage.py, как будто онибыли все в одном файле:

./manage.py test app.some_test_in_bananas
40 голосов
/ 22 апреля 2014

Поведение изменилось в Django 1.6, поэтому больше нет необходимости создавать пакет. Просто назовите ваши файлы test*.py.

Из документации Django 1.7

Когда вы запускаете свои тесты, поведение утилиты тестирования по умолчанию найти все тестовые случаи (то есть подклассы unittest.TestCase) в любом файле, имя которого начинается с теста, автоматически построить тест набор из этих тестовых случаев, и запустите этот набор.

Из документации Django 1.6 ,

Обнаружение теста основано на встроенном тесте модуля unittest. открытие. По умолчанию это обнаружит тесты в любом файле с именем «Test * .py» в текущем рабочем каталоге.

Предыдущее поведение, из документации Django 1.5 :

Когда вы запускаете свои тесты, поведение тестовой утилиты по умолчанию найти все тестовые случаи (то есть подклассы unittest.TestCase) в файлах models.py и tests.py автоматически создает набор тестов из эти тестовые случаи, и запустить этот набор.

Существует второй способ определения набора тестов для модуля: если вы определить функцию с именем suite () в models.py или tests.py, Django Test Runner будет использовать эту функцию для создания набора тестов. для этого модуля. Это следует за предложенной организацией для единицы тесты. Смотрите документацию по Python для более подробной информации о том, как построить комплексный набор тестов.

26 голосов
/ 03 апреля 2013

Ответ, заявленный Томашем, правильный. Однако может быть утомительно убедиться, что импорт в __init__.py соответствует вашей файловой структуре.

К автоматически обнаруживает все тесты в папке , вы можете добавить это в __init__.py:

import unittest

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

Это позволит вам запустить ./manage.py test appname, но не справится с выполнением определенных тестов. Для этого вы можете использовать этот код (также в __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

10 голосов
/ 21 сентября 2017

Просто создайте структуру каталогов следующим образом:

myapp/
    __init__.py
    tests/
        __init__.py
        test_one.py
        test_two.py
        ...
    ...

И python manage.py test myapp будет работать как положено.

5 голосов
/ 06 июня 2011

http://docs.python.org/library/unittest.html#organizing-tests говорит о разбиении файлов на модули, и в разделе справа над ним есть пример.

1 голос
/ 07 ноября 2016

Не нужно ничего кодировать в init. Просто создайте подкаталог в вашем приложении. Единственное требование не называть это тестами * Для примера

app/
app/__init_.py
app/serializers.py
app/testing/
app/testing/__init__.py
app/testing/tests_serializers.py
1 голос
/ 05 марта 2012

Если у вас более сложная настройка или вы не хотите использовать операторы from ... import * -типа, вы можете определить функцию с именем suite в вашем tests.py (или tests / __ init__.py), которая возвращает экземпляр unittest.TestSuite.

0 голосов
/ 27 апреля 2019

С Django 2.2 простым и довольно хорошим решением может быть создание папки test внутри приложения, и вы можете поместить связанные с ней файлы test_...py, просто добавив __init__.py в папку test.

0 голосов
/ 22 февраля 2015

Я думаю, ./manage.py test просто выполняет все тесты (в django> = 1.7).

Если ваши организующие тесты - это примерно группировка и вишня , и вы являетесь поклонником nose, используйте нос Джанго :

python manage.py test another.test:TestCase.test_method

Если вы знаете, что нос, то вы знаете, как "подстановочный знак" гораздо лучше для всех ваших файлов.

PS

Это просто лучшая практика. Надеюсь, это поможет. Ответ был заимствован здесь: Запуск конкретного тестового примера в Django, когда в вашем приложении есть каталог тестов

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