2015-12-27 5 views
2

Я настраиваю функциональное тестирование с использованием Selenium для сайта Django. У меня есть файл fixture (users/fixtures/users.json), и я использую его в функциональных тестах в другом приложении (accounts). При запуске тестов я также запускаю свой сервер разработки для приема запросов от автоматизации браузера Selenium; Я запускаю ./manage.py test и ./manage.py runserver в том же самом модуле настроек, чтобы у обоих были учетные данные для одной и той же базы данных.Тесты Django с селеном, не загружающим светильники

Мои accounts тесты не удается загрузить users приспособление:

from django.test import TestCase 


class AccountCreationTestCase(TestCase): 
    fixtures = ['users'] 

    # Tests depending on user login follow. 
    # These tests are run via Selenium for browser automation. 

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

Напомним: я запускаю ./manage.py test и ./manage.py runserver в том же модуле настроек, который определяет учетные данные доступа к тестовой базе данных. Если светильники загружаются в тестовую базу данных, эти данные должны быть доступны для тестов, когда они запускаются через Selenium.

Что мне не хватает?

Редактировать 1: В контексте я использую Django 1.8. Кроме того, я использую Selenium для автоматизации PhantomJS, чтобы тесты могли работать быстрее.

Редактировать 2: Я только что сделал более подробное чтение документов Django и нашел два вопроса, с которыми сталкиваюсь.

Первый выпуск: Джанго тесты automatically prefix имя базы данных с test_, так что вы должны убедиться, что ваш тестовый сервер и тесты Django используют ту же базу данных по имени, например, так:

DATABASES = { 
    'NAME': "test_db_name", 
    'TEST': { 
     'NAME': "test_db_name" 
    } 
} 

Второй вопрос : Django docs объясняют, что Django разрушает тестовые базы данных между тестовыми запусками. Это приведет к сбою сервера разработки, поскольку для этого требуется наличие базы данных. Django 1.8 представила опцию --keepdb для тестового бегуна, которая будет поддерживать экземпляр базы данных между тестами. Хотя этот флаг позволяет серверу работать в тестовой базе данных, я все равно не могу заставить приборы загружаться в эту базу данных. Это может быть вызвано использованием нового флага, который существенно изменяет поведение тестов с точки зрения загрузки тестовой базы данных.

ответ

1

Джанго тестирование с помощью Selenium может быть обидчивым. Напомним, есть три основные проблемы, с которыми вам приходится иметь дело, чтобы получить такие тесты:

1) Selenium нуждается в запущенном сервере Django для отладки запросов.

2) Ваш запущенный сервер Django должен быть подключен к тестовой базе данных.

3) Тесты TestCase выполняются в транзакции.Поскольку работающий сервер Django не может видеть транзакцию тестового примера, любые загружаемые приборы будут полностью невидимыми/недоступными для Selenium (источник: Lara's link, qris's answer).

Решение: Чтобы решить первые две проблемы, вам нужен файл настроек для тестирования. В нем вам нужно определить базу данных по умолчанию, которая указывает на вашу тестовую базу данных, и вам необходимо указать настройки базы данных тестирования, чтобы имена совпадали (см. Пример в моем вопросе). Когда вы планируете запускать свои тесты, вам нужно запустить сервер разработки Django и ваши тесты, используя файл настроек тестирования.

Чтобы решить третью проблему, используйте TransactionTestCase вместо TestCase. TransactionTestCase призван дать разработчикам более тонкий контроль над поведением транзакций во время тестирования, поэтому он автоматически не запускает все внутри транзакции (что, в свою очередь, дает доступному экземпляру экземпляра сервера доступ к светильникам). Несмотря на то, что это не совсем то, что мы пытаемся сделать в этом случае, результат заключается в том, что тесты работают и автоматически очищаются автоматически.

Примечание: Вам следует, вероятно, рассмотреть возможность отделения тестов черного ящика и белого ящика друг от друга. Это держит ваши тесты Django «ванилью», поэтому будущим разработчикам не нужно тратить столько времени, сколько выясняет, почему документация Django, похоже, не применяется во всех случаях. Он также отделяет функциональные тесты от модульных тестов, что хорошо в тех случаях, когда разработчик в вашей команде не имеет доступа к Selenium (или совместимой версии Selenium) на своей машине или когда вы хотите запускать только модульные тесты или функциональные тесты, но не оба. Вам нужно будет вручную настроить свою тестовую среду в соответствии с вашими потребностями, но я считаю, что в конечном итоге этот код будет содержать очищающий код.

Спасибо Ларе за то, что указали мне в правильном направлении.

1

Однажды у меня была такая же проблема, и я заметил, что каким-то образом тестовый пример Django и Selenium не используют одну и ту же базу данных. Зачем? Я понятия не имею!

Я думаю, что-то о Teardown и настройке ... Во всяком случае, я думаю, вы можете решить вашу проблему здесь ->How to have Django test case and Selenium server use same database?

+0

Похоже, что это может сработать (соединение с базой данных в памяти может сохраняться, даже если сама база данных разрушена и создана между каждым тестовым прогоном). Я попробую это и посмотрю, не могу ли я использовать свой прецедент для работы. – Adam

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