如何知道在 django 中运行单元测试的环境适用于哪个环境

Posted

技术标签:

【中文标题】如何知道在 django 中运行单元测试的环境适用于哪个环境【英文标题】:how to know which environment running unit tests in django works on 【发布时间】:2016-11-27 20:57:56 【问题描述】:

问题

我想将我的产品设置与本地设置分开。我找到了这个库django-split-settings,它运行良好。

但是在我的代码中的某个地方我有这样的东西:

if settings.DEBUG:

  # do debug stuff
else:
  # do prod stuff

问题是当我运行我的单元测试命令时:

./run ./manage.py test

上述 if 语句将 settings.DEBUG 评估为假。这让我想知道,哪个设置文件是读取的测试命令以及如何更正它

我尝试过的

我尝试运行这样的命令:

./run ./manage.py test --settings=bx/settings

给我这个崩溃:

Traceback (most recent call last):
  File "./manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/beneple/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 350, in execute_from_command_line
    utility.execute()
  File "/beneple/venv/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 302, in execute
    settings.INSTALLED_APPS
  File "/beneple/venv/local/lib/python2.7/site-packages/django/conf/__init__.py", line 55, in __getattr__
    self._setup(name)
  File "/beneple/venv/local/lib/python2.7/site-packages/django/conf/__init__.py", line 43, in _setup
    self._wrapped = Settings(settings_module)
  File "/beneple/venv/local/lib/python2.7/site-packages/django/conf/__init__.py", line 99, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: Import by filename is not supported.

有什么想法吗?


更新:

这就是我的运行命令的样子

#!/usr/bin/env bash
DIR="$( cd "$( dirname "$BASH_SOURCE[0]" )" && pwd )"
docker run \
  --env "PATH=/beneple/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" \
  -e "DJANGO_SETTINGS_MODULE=bx.settings.local" \
  --link beneple_db:db \
  -v $DIR:/beneple \
  -t -i --rm \
  beneple/beneple \
  $@

目前我的 manage.py 看起来像这样

#!/usr/bin/env python
import os
import sys

    if __name__ == "__main__":

        from django.core.management import execute_from_command_line

        execute_from_command_line(sys.argv)

如果我运行这个命令:

./run ./manage.py shell

它工作正常.. 但例如当我尝试运行时

./run ./flu.sh 

依次运行 test_data.py,它的开头如下:

#!/usr/bin/env python
if __name__ == "__main__":
    import os, sys
    sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

    import django
    django.setup()


..
from django.conf import settings
from settings import DOMAIN

它给了我错误:

Traceback (most recent call last):
  File "./bx/test_data.py", line 18, in <module>
    from settings import DOMAIN
ImportError: cannot import name DOMAIN
Done.

我不确定为什么会这样,因为我的 base.py 肯定设置了 DOMAIN。

【问题讨论】:

什么是./run?你能列出你的settings.pymanage.py 吗? --settings 应该是 @Raja Simon 提到的模块路径 ***.com/questions/7447134/… 【参考方案1】:

--settingsThe Python path to a settings module。所以bx 是你的根项目文件夹和settings.py 文件然后

./run ./manage.py test --settings="bx"

【讨论】:

这样做会给我这个错误:django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty. 在此处查看堆栈跟踪> gist.github.com/abbood/163f4e73d0a8e54972e39bb30a157d2e 您必须设置 SECRET_KEY .... 最初 Django 不会提供任何密钥,因为这是敏感的.. 所以您必须提供.. SECRET_KEY="你的钥匙" 我已经在我的settings.py 文件中设置了secret_key。这是否意味着它正试图在另一个文件中找到它?这一行引起了我的注意`文件“/beneple/venv/local/lib/python2.7/site-packages/django/test/utils.py”,第139行,在get_runner test_runner_class= settings.TEST_RUNNER`.. 这是否意味着我必须按照此处的说明创建 runtests.pytests/test_settings.py docs.djangoproject.com/en/1.9/topics/testing/advanced/…【参考方案2】:

Django测试,默认设置DEBUG = False

https://docs.djangoproject.com/en/1.9/topics/testing/overview/#other-test-conditions

【讨论】:

那么我该如何解决呢?

以上是关于如何知道在 django 中运行单元测试的环境适用于哪个环境的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python Django 中运行单元测试时禁用日志记录?

如何在 Python 中的每个单元测试之前和之后运行特定代码

django 在运行测试时如何查看 sql 查询?

nginx+uwsgi+virtualenv+django搭建django生产运行环境

如何将 django 单元测试分布在多个文件上?

编写 Django 应用单元测试