2016-06-27 7 views
2

У меня была аналогичная проблема с этим перед, где я получил сообщение почти идентичные ошибки, т.е.django.core.exceptions ImproperlyConfigured ошибка при запуске функционального теста селена в питона

C:\Users\David J\optilab\optilab_project>python functional_tests.py 
Traceback (most recent call last): 
    File "functional_tests.py", line 4, in <module> 
    from optilab.models import Design 
    File "C:\Users\David J\optilab\optilab_project\optilab\models.py", line 10, in <module> 
    class Design(models.Model): 
    File "C:\Users\David J\optilab\optilab_project\optilab\models.py", line 11, in Design 
    name = models.CharField(max_length=30) 
    File "C:\Python27\lib\site-packages\django\db\models\fields\__init__.py", line 1072, in __init__ 
    super(CharField, self).__init__(*args, **kwargs) 
    File "C:\Python27\lib\site-packages\django\db\models\fields\__init__.py", line 166, in __init__ 
    self.db_tablespace = db_tablespace or settings.DEFAULT_INDEX_TABLESPACE 
    File "C:\Python27\lib\site-packages\django\conf\__init__.py", line 55, in __getattr__ 
    self._setup(name) 
    File "C:\Python27\lib\site-packages\django\conf\__init__.py", line 41, in _setup 
    % (desc, ENVIRONMENT_VARIABLE)) 
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings. 

Но он производится потому что я неправильно вызывал свой тест из оболочки. Теперь я пытаюсь запустить функциональный тест, который я сделал несколько раз, прежде чем успешно использовать команду "python functional_tests.py" в моей папке проекта, но она выдает указанное выше сообщение об ошибке. Может ли кто-нибудь сказать мне, что я делаю неправильно, или почему это, возможно, работало раньше, но не сейчас? спасибо.

Edit: Вот functional_tests.py:

from selenium import webdriver 
import unittest 
from selenium.webdriver.common.keys import Keys 
from optilab.models import Design 
from automa.api import * 

class HomeTest(unittest.TestCase): 

    def setUp(self): 
     self.browser = webdriver.Firefox() 
     self.browser.get('http://localhost:8000/lab') 
     self.new_design = self.browser.find_element_by_id("new_design") 
     self.load_design = self.browser.find_element_by_id("load_test") 
     self.design_name = self.browser.find_element_by_id("design_name") 
     self.browser.implicitly_wait(3) 

    def test_latest_designs_displayed_in_table(self): 
     # 

     self.browser.implicitly_wait(3) 
     self.design_table = self.browser.find_element_by_id("design_table") 
     self.rows = self.browser.find_elements_by_tag_name('tr') 
     self.assertTrue(
      any(row.text == 'My First Design' for row in rows), 
      "New design did not appear in test table." 
     ) 

    def test_entering_text_activates_new(self): 
     # user enters name of design. new becomes clickable.    
     self.browser.implicitly_wait(3) 
     self.design_name.send_keys("sample_design") 

    def test_new_test_can_be_saved_and_retrieved(self): 
     name = "sample design" 
     self.design_name.send_keys(name) 
     self.new_design.click() 
     self.browser.implicitly_wait(3) 
     self.saved_design = Design.objects.get(name=design_name) 

    def test_entering_name_of_previously_saved_test_activates_load(self): 
     # user enters the name of a previously saved test. load button becomes clickable. 
     design = Design(name="sample_design") 
     saved_design = Design.objects.get(id=1).name 
     self.browser.implicitly_wait(3) 
     self.design_name.send_keys(saved_design) 
     self.load_design.click() 

    def test_entering_name_of_previously_saved_test_but_clicking_new_prompts_overwrite(self): 
     # user entes name of saved test but clicks new. dialogue box asks if test should be overwritten. 
     previously_saved_design = Design.objects.get(id=1).name 
     self.design_name.send_keys(previously_saved_design)      

    def test_clicking_save_redirects_to_model(self): 
     pass 

    def tearDown(self): 
     self.browser.quit() 



if __name__ == '__main__': 

unittest.main() 
+1

Вы можете показать 'functional_tests.py'? Вероятно, вам нужно установить модуль настроек ('os.environ [" DJANGO_SETTINGS_MODULE "]') и/или вызвать 'django.setup()'. – knbk

+0

@knbk Я добавил function_tests.py. Где я могу установить модуль настроек? –

+0

Возможный дубликат [Конфигурирование Django] (http://stackoverflow.com/questions/20794901/configuring-django) –

ответ

1

Начало вашего скрипта должно выглядеть примерно так

import os, sys 
sys.path.append(os.getcwd()) 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "optilab.settings") # or whatever 
import django 
django.setup() 


from selenium import webdriver 
import unittest 
from selenium.webdriver.common.keys import Keys 
from optilab.models import Design 
from automa.api import * # try not to do this 
+0

Использование этого verbatim дает мне ImportError (без модуля с именем settings_stream). Я не уверен, как изменить это, чтобы работать с моим личным проектом. –

+0

К сожалению. Ошибка копирования патча! Я скопировал один из моих тестов на селен, где мой файл настроек называется settings_stream. Обновлен ответ с правильным – e4c5

+0

Теперь он говорит «importerror: no module named settings». –

0

Это происходит потому, что Django не был правильно настроен, прежде чем пытаться позвонить настроек, он не знает, какие параметры проекта следует использовать без переменной "DJANGO_SETTINGS_MODULE", а вызов django.setup() необходим для импорта моделей и доступа к базе данных. (см. e4c5's answer для этого метода)

Однако это не рекомендуемый метод или самый простой способ. Вы можете вызвать функциональные тесты так же, как модульные тесты от manage.py test, а Django автоматически настроит все для вас, он даже будет использовать tempdb для функциональных тестов. Если ваши функциональные тесты включают вставки и обновления в функциональных тестах (и вам следует), то tempdb пригодится.

Чтобы использовать этот объект, вы должны изменить несколько вещей в своем коде.

Сначала есть вопрос имя файла, шаблон по умолчанию для manage.py test (doc) является «тест * .py», вы можете изменить это с помощью -p или --pattern, но обычное решение переименовать functional_tests.py к тестам. py и поместите его в папку functional_tests. Таким образом, вы можете вызвать только функциональные тесты, позвонив по телефону manage.py test functional_tests.

Кроме того, вместо того, чтобы импортировать TestCase из UnitTest вы должны смотреть в использовании TestCase (doc) из django.test или даже LiveServerTestCase (doc), который позволит сэкономить вам избежать запуска manage.py runserver себя.

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