2017-07-23 58 views
1

我有一個Django應用程序,工作正常。當我使用pytest運行測試時,它只能與實用程序類一起工作(所以不是與Django相關的)。pytest無法訪問Django類

例如,軟件包A從該軟件包或其他軟件調用實用程序類的測試工作正常。 但是,只要我導入一個django類,我就會面臨錯誤。

例如1: 導入我的模型(測試),以開始測試類:

from app.common.models import Country 

- >導入錯誤:沒有模塊名爲django.db

[Django的.db在models.py中調用]

示例2:我導入一個url解析器(在測試中),啓動測試類:

from django.core.urlresolvers import reverse

- >導入錯誤:沒有模塊名爲django.core.urlresolvers

第一次嘗試修復

繼另一個話題,我設置PYTHONPATH的內容:

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

此文件夾包含instal在virtualenv:django,pytest,psycopg2,以及更多的領導包。 1)如果我將DJANGO_SETTINGS_MODULE設置爲與應用程序相同的文件,則「py.test」會給出以下結尾的錯誤: 文件「/home/user/pyenv/lib/python3.5/site-packages/django /db/backends/postgresql/base.py」,第24行,在 提高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的: '測試'對象沒有屬性 '客戶'

更多的相關信息

1)Python解釋,爲應用程序,位於一個的virtualenv。

2)conftest.py位於應用程序的根文件夾,所以相同的位置manage.py,並具有以下內容:

import os 
import sys 

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

3)pytest.ini位於同一文件夾中管理。PY也與此內容:

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

4)最重要的是:應用程序正常工作,所以DB設置有效

如果你有什麼是錯的,以及如何測試Django的類,任何任何想法想法會受到歡迎。先謝謝你。

回答

2

我使用pytest-django,我也明確設置DJANGO_SETTINGS_MODULE=project.my_settingspytest.ini。每次都很棒。

0

只是想知道,爲什麼不只是使用Django的測試呢?

python manage.py test 
0

我遇到了其他問題,試圖使用標準的Django測試工具+覆蓋。 在「--cov」中使用Pytest僅在一個命令中爲我提供了所需的內容。

我終於找到了解決這個問題的方法。再次嘗試後,重新啓動一切(pc,virtualenv),它工作正常。 所以:

1)啓動的virtualenv並移動到應用程序文件夾

2)不設置PYTHONPATH

3)設置DJANGO_SETTINGS_MODULE應用設置在pytest.ini

(因此只項目中的一個設置文件)

4)運行與測試:py.test --cov=my_application_name

現在我可以無誤地測試模型或表單。

有關的網址前面提到的測試,現在它工作的語法如下:

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)