Подтвердить что ты не робот

Как распространять тесты модуля django по нескольким файлам?

  • У меня есть приложение python-django
  • Я использую модульную структуру тестирования
  • Тестирование выполняется в файле "tests.py" в каталоге модуля
  • Я запускаю тесты через ./manage.py test app

Теперь..

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

Как?

4b9b3361

Ответ 1

Поведение изменилось в 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 будет использовать эту функцию для построения набора тестов для этого модуля. Это следует за предлагаемой организацией для подразделения тесты. См. Документацию Python для получения более подробной информации о том, как постройте сложный набор тестов.

Ответ 2

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

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

I.e: замените файл 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

Ответ 3

Ответ, сформулированный Томашем, верен. Тем не менее, может оказаться утомительным, чтобы импорт в __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

Ответ 4

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

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

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

Ответ 6

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

Ответ 7

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

app/
app/__init_.py
app/serializers.py
app/testing/
app/testing/__init__.py
app/testing/tests_serializers.py

Ответ 8

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

Если ваши организующие тесты касаются группировки и вишни, а вы фанат nose используйте django nose:

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

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

PS

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

Ответ 9

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