如何知道在 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.py
和manage.py
吗? --settings 应该是 @Raja Simon 提到的模块路径
***.com/questions/7447134/…
【参考方案1】:
--settings
是 The 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.py
和 tests/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 中的每个单元测试之前和之后运行特定代码