pytest无法访问django类

时间:2017-07-23 21:16:44

标签: python django pytest

我有一个Django应用程序,工作正常。当我使用pytest运行测试时,它只适用于实用程序类(因此不与Django相关)。

例如,来自包A的测试从该包或其他包中调用实用程序类,可以正常工作。 但是,一旦导入django类,我就会面临错误。

示例1 : 我导入我的模型(在测试中),用以下代码启动测试类:

from app.common.models import Country

- > ImportError:没有名为django.db的模块

[models.py]中调用[django.db]

示例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"给出此错误以以下结尾:   文件" /home/user/pyenv/lib/python3.5/site-packages/django/db/backends/postgresql/base.py" ;,第24行,在     提出不正确的配置("加载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:'测试'对象没有属性' 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)最重要的是:应用程序运行正常,因此数据库设置有效

如果你知道什么是错的,以及如何测试django课程,那么任何想法都会受到欢迎。提前谢谢。

3 个答案:

答案 0 :(得分:2)

我使用pytest-django,我还在DJANGO_SETTINGS_MODULE=project.my_settings中明确设置了pytest.ini。每次都很棒。

答案 1 :(得分:0)

只是想知道,为什么不使用Django的测试?

python manage.py test

答案 2 :(得分:0)

我在尝试标准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)