无法运行 Django 单元测试。返回 django.core.exceptions.ImproperlyConfigured

问题描述 投票:0回答:3

我多年来一直在我的 Django 应用程序上运行单元测试 (test.py),没有出现任何问题。在我的最后一次会议中,我正在修改我的 MYSQL 数据库和模型。在试验模型时,我一直在删除并重新创建数据库,删除迁移文件并从头开始进行迁移。

现在,单元测试将无法运行。

Traceback (most recent call last):
  File "/opt/pycharm-2017.2.1/helpers/pycharm/_jb_unittest_runner.py", line 35, in <module>
    main(argv=args, module=None, testRunner=unittestpy.TeamcityTestRunner, buffer=not JB_DISABLE_BUFFERING)
  File "/usr/lib/python3.5/unittest/main.py", line 93, in __init__
    self.parseArgs(argv)
  File "/usr/lib/python3.5/unittest/main.py", line 140, in parseArgs
    self.createTests()
  File "/usr/lib/python3.5/unittest/main.py", line 147, in createTests
    self.module)
  File "/usr/lib/python3.5/unittest/loader.py", line 219, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/usr/lib/python3.5/unittest/loader.py", line 219, in <listcomp>
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/usr/lib/python3.5/unittest/loader.py", line 153, in loadTestsFromName
    module = __import__(module_name)
  File "/home/danny/PycharmProjects/AskArby/deals/tests.py", line 3, in <module>
    from deals.models import Retailer
  File "/home/danny/PycharmProjects/AskArby/deals/models.py", line 5, in <module>
    class Retailer(models.Model):
  File "/home/danny/PycharmProjects/AskArby/deals/models.py", line 6, in Retailer
    name = models.CharField(max_length=200)
  File "/home/danny/.virtualenvs/AskArby/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 1061, in __init__
    super(CharField, self).__init__(*args, **kwargs)
  File "/home/danny/.virtualenvs/AskArby/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 172, in __init__
    self.db_tablespace = db_tablespace or settings.DEFAULT_INDEX_TABLESPACE
  File "/home/danny/.virtualenvs/AskArby/lib/python3.5/site-packages/django/conf/__init__.py", line 56, in __getattr__
    self._setup(name)
  File "/home/danny/.virtualenvs/AskArby/lib/python3.5/site-packages/django/conf/__init__.py", line 39, 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.

PyCharm 还告诉我没有找到测试。

这是 models.py 的开头:

from django.db import models
from django.utils.translation import ugettext_lazy as _

class Retailer(models.Model):
    name = models.CharField(max_length=200)
    base_url = models.URLField(max_length=500)
    currency = models.CharField(max_length=3)
    #css parameters for finding deals and subfields in HTML
    deal_container_css = models.CharField(max_length=300)
    title_css = models.CharField(max_length=300)
    price_css = models.CharField(max_length=300)
    old_price_css = models.CharField(max_length=300, null=True, blank=True)
    brand_css = models.CharField(max_length=300, null=True, blank=True)
    image_css = models.CharField(max_length=300, null=True, blank=True)
    description_css = models.CharField(max_length=300, null=True, blank=True)
    #for things that look like deal containers but aren't
    exclude_css = models.CharField(max_length=300, null=True, blank=True)
    shipping_css = models.CharField(max_length=300, null=True, blank=True)
    product_model_css = models.CharField(max_length=300, null=True, blank=True)

测试.py:

from django.test import TestCase
import unittest
from deals.models import Retailer

class RetailerTests(TestCase):
    fixtures = ['initial_data.json']

class TestRetailer(unittest.TestCase):

    def setUp(self):
        self.bestbuy = Retailer(Retailer.objects.get(pk=1))

    def test_name(self):
        self.assertEqual(self.bestbuy.name, 'Best Buy')

我正在使用Pycharm,将runserver作为manage.py命令运行。我尝试从命令行设置 DJANGO_SETTINGS_MODULE,它回显了正确的答案:AskArby.settings。我尝试调用 settings.configure(),它告诉我设置已配置。

另外,当我运行 runserver 时,我收到此警告:

?: (1_8.W001) The standalone TEMPLATE_* settings were deprecated in Django 1.8 and the TEMPLATES dictionary takes precedence. You must put the values of the following settings into your default TEMPLATES dict: TEMPLATE_DIRS.
deals.Marketplace.listing: (fields.W340) null has no effect on ManyToManyField.

为什么我的应用程序似乎无法在 test.py 中运行我的单元测试?

python mysql django unit-testing django-models
3个回答
3
投票

如果您从 ide 运行而不是从命令行运行,请在运行方法之前添加这些代码:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "[your appname].settings")
import django
django.setup()

祝你好运!


0
投票

今天我在 PyCharm 中运行了一些测试模块,这些模块之前已经运行了数百次,但我得到了 Django ImproperlyConfigured 错误。

我发现 PyCharm 无法正确检测文件是 Django 测试而不是常规 Python 文件(它在 Django 测试的运行选项卡中显示不同的图标,其中包含 Django 徽标)。我运行了几次,最终 PyCharm 厌倦了烦我(这大约需要 30 分钟左右)并正确检测到它们。别问我发生了什么事。我没有重新启动IDE。我只是运行了几次不同的测试模块并进行了探索。所以——这个问题并不总是用户错误,有时是 IDE 中的错误。不幸的是,这意味着我没有解决办法。也许 JetBrains 可以?


0
投票

我有完全相同的问题,来这里寻找答案。我认为问题在于你的

TestRetailer
测试用例实际上是基于 Python
unittest.TestCase
,而不是
django.test.TestCase

您的代码开始...

from django.test import TestCase
import unittest
from deals.models import Retailer
...

class TestRetailer(unittest.TestCase):
...

所以 TestRetailer 的测试类实际上是基于标准的 Python TestCase。这很重要,因为 Django TestCase 包含一些 Django 特定的初始化。

© www.soinside.com 2019 - 2024. All rights reserved.