使用django.test.client测试应用程序http请求,获取错误

时间:2013-05-02 19:44:22

标签: python django unit-testing

我们开始为我们的API编写单元测试(使用Django Rest Framework创建)。我们决定从简单开始,使用内置的unittest和django.test.client类。我已经编写了测试的存根,它运行得很好:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import absolute_import
import unittest

# from django.test.client import Client

class TestGrowth(unittest.TestCase):
    def setUp(self):
        # self.client = Client()
        pass

    def test_numbers_3_4(self):
        self.assertEqual(4, 4, True)

    def test_strings_a_3(self):
        self.assertEqual('andy', 'andy', True)


def suite():
    suite = unittest.TestSuite()

    # Add test cases to suite
    suite.addTests(unittest.makeSuite(TestGrowth))

    return suite

if __name__ == '__main__':
    # Run test suite
    unittest.TextTestRunner(verbosity=2).run(suite())

但是,一旦我取消注释行from django.test.client import Client,我就会收到错误:

Traceback (most recent call last):
  File "./AccountGrowth.py", line 8, in <module>
    from django.test.client import Client
  File "/home/vagrant/.virtualenvs/emmasocial/lib/python2.7/site-packages/django/test/__init__.py", line 5, in <module>
    from django.test.client import Client, RequestFactory
  File "/home/vagrant/.virtualenvs/emmasocial/lib/python2.7/site-packages/django/test/client.py", line 21, in <module>
    from django.db import close_connection
  File "/home/vagrant/.virtualenvs/emmasocial/lib/python2.7/site-packages/django/db/__init__.py", line 11, in <module>
    if settings.DATABASES and DEFAULT_DB_ALIAS not in settings.DATABASES:
  File "/home/vagrant/.virtualenvs/emmasocial/lib/python2.7/site-packages/django/conf/__init__.py", line 53, in __getattr__
    self._setup(name)
  File "/home/vagrant/.virtualenvs/emmasocial/lib/python2.7/site-packages/django/conf/__init__.py", line 46, in _setup
    % (desc, ENVIRONMENT_VARIABLE))
django.core.exceptions.ImproperlyConfigured: Requested setting DATABASES, but settings are not configured.
You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

我们在settings.py中定义DATABASES如下:

if "DATABASE_URL" in os.environ:
    # Parse database configuration from $DATABASE_URL
    DATABASES = {
        'default': dj_database_url.config()
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',  # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
            'NAME': 'emmasocial',                  # Or path to database file if using sqlite3.
            'USER': 'root',                        # Not used with sqlite3.
            'PASSWORD': '',                        # Not used with sqlite3.
            'HOST': '',                            # Set to empty string for localhost. Not used with sqlite3.
            'PORT': '',                            # Set to empty string for default. Not used with sqlite3.
        }
    }

我使用以下命令<app>/api/testspython ./AccountGrowth.py内的vagrant shell中运行测试。

有人能说清楚为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

你没有通过Django的测试运行器运行测试,它为你设置了所有这些。您不需要if __name__ == '__main__'阻止或明确调用run(),您应该通过./manage.py test运行测试。