2015-05-26 1 views
0

Я использую Django 1.8. Я писал тесты для своего Django API в одном длинном файле с именем test_api.py. Структура файла было следующим:Django: Разделить тесты на несколько файлов, но использовать одну и ту же базу данных?

def setUpModule(): 
    management.call_command('loaddata', 'frontend/fixtures/data.json', 
         verbosity=0) 
    management.call_command('my_custom_command') 

def tearDownModule(): 
    management.call_command('flush', verbosity=0, interactive=False) 


class TestAPIBNFViews(TestCase): 
    def test_api_view_list_all(self): 
    url = '/api/1.0/bnf_code' 
    # do testing 

def test_api_view_query(self): 
    # more testint 

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

Теперь, однако, файл становится длинным и громоздким, и я хочу разбить его на несколько файлов. Я создал несколько файлов под названием test_list и test_query и дал каждому раздел setUpModule, как указано выше.

Однако, во-первых, это не DRY, а во-вторых, когда я бегу python manage.py test, много испытаний неудачу с дублированием иностранных ключевых ошибок, таких как:

ProgrammingError: relation "frontend_sha_id" already exists 

Я думаю, это не удивительно, так как тесты пытаются создать тестовую базу данных несколько раз.

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

Как я могу запустить setUpModule один раз, прежде чем все тесты будут выполнены, и по-прежнему держать тесты в отдельных файлах для удобства?

+0

Быстрое и грязное решение: в каждом файле перед запуском создания базы данных вы можете проверить, не существует ли она еще. –

+0

Я предполагаю, что у меня мог бы быть один файл с именем 'test_all.py', и я мог бы импортировать все остальное в качестве модуля ... это сработает? – Richard

ответ

1

Вместо использования глобального setUpModule для обоих классов испытаний вы также можете использовать setUpTestData один раз в каждом классе TestCase. От Django documentation: Testing tools:

атомный блок на уровне класса ... позволяет создавать исходных данных на уровне класса, один раз за весь TestCase.

+0

Разве это не оставило бы меня с той же проблемой, что нужно иметь все в одном очень длинном файле? – Richard

+0

Вы можете определить 'setUpTestData' один раз в каждом классе (который будет один раз на файл, я полагаю, если у вас не более одного класса для каждого файла). Затем вы можете вызвать эту функцию, вызвав другую функцию в одном из n тестовых файлов, которые действительно устанавливают данные, чтобы избежать DRY. – Wtower

+0

Спасибо! Хотя тогда я не просто закончу те же ошибки, о уже существующей базе данных ...? – Richard

Смежные вопросы