pytest не может получить доступ к классам django

У меня есть приложение Django, работающее нормально. Когда я запускаю тесты с помощью pytest, он работает только с служебными классами (поэтому не связан с Django).

Например, тест из пакета A, вызывающий служебный класс из этого или другого пакета, работает нормально. Однако я сталкиваюсь с ошибкой, как только импортирую класс django.

пример 1: я импортирую свою модель (в тесте), начиная с тестового класса:

from app.common.models import Country

-> ImportError: нет модуля с именем django.db

[django.db вызывается в models.py]

пример 2: я импортирую преобразователь URL (в тесте), начиная тестовый класс с:

from django.core.urlresolvers import reverse

-> ImportError: нет модуля с именем django.core.urlresolvers

первая попытка исправления

Следуя другой теме, я установил содержимое PYTHONPATH:

/home/user/pyenv/lib/python3.5/site-packages

Эта папка содержит установленные пакеты в virtualenv: django, pytest, psycopg2 и другие.

1) Если я установил DJANGO_SETTINGS_MODULE в тот же файл, что и приложение, "py.test" выдаст эту ошибку, оканчивающуюся на: File "/home/user/pyenv/lib/python3.5/site-packages/django/db/backends/ postgresql / base.py ", строка 24, в raise ImproperlyConfigured (" Ошибка при загрузке модуля psycopg2:% s "% e)

2) Если я устанавливаю DJANGO_SETTINGS_MODULE на меньший файл настроек теста, содержащий только информацию о базе данных, я сталкиваюсь с другой ошибкой (сбой self.client в тесте):

class Test(unittest.TestCase):
    def testUrls(self):
        response = self.client.get('/countries/all/get')
        self.assertEqual(response.status_code, 200)  

-> AttributeError: объект 'Test' не имеет атрибута 'client'

дополнительная информация:

1) Интерпретатор Python для приложения находится в файле virtualenv.

2) conftest.py находится в корневой папке приложения, в том же месте, что и manage.py, и имеет следующее содержимое:

import os
import sys

sys.path.append(os.path.dirname(__file__))

3) pytest.ini находится в той же папке, что и manage.py, с таким содержимым:

[pytest]
python_files = test_*.py test*.py

4) самое главное: приложение работает нормально, поэтому настройки db действительны

Если у вас есть представление о том, что не так и как тестировать классы django, любая идея будет приветствоваться. Заранее спасибо.


person petitth    schedule 23.07.2017    source источник


Ответы (2)


Я использую pytest-django и также явно устанавливаю DJANGO_SETTINGS_MODULE=project.my_settings в pytest.ini. Каждый раз отлично работает.

person valignatev    schedule 23.07.2017

Я столкнулся с другими проблемами, пытаясь использовать стандартный инструмент тестирования Django + покрытие. Использование Pytest с «--cov» предоставило мне то, что мне было нужно, всего в одной команде.

Наконец-то я нашел решение проблемы. После повторной попытки и перезапуска всего (pc, virtualenv) он работал нормально. Так :

1) запускаем virtualenv и переходим в папку приложения

2) не устанавливайте PYTHONPATH

3) установите DJANGO_SETTINGS_MODULE в настройки приложения в pytest.ini

(так что в проекте только один файл настроек)

4) запустите тест с: py.test --cov=my_application_name

Теперь я могу тестировать модели или формы без ошибок.

Для ранее упомянутого теста URL-адресов теперь он работает со следующим синтаксисом:

import unittest
from django.test import Client

class Test(unittest.TestCase):

    def setUp(self):
        # global variable
        self.client = Client()

    def testUrls(self):
        reponse = self.client.get('/countries/all/get')
        self.assertEqual(reponse.status_code, 200) 
person petitth    schedule 24.07.2017