那么,有人知道如何做吗?
编辑:
这是我的方法:
#in settings.py
import sys
TEST = 'test' in sys.argv
希望能帮到你。
#in settings.py
import sys
TEST = 'test' in sys.argv
希望能帮到你。
我认为这里提供的答案https://dev59.com/AG855IYBdhLWcg3w5IvZ#7651002是更加简洁的方法:
将以下内容放入您的settings.py文件中:
import sys
TESTING = sys.argv[1:2] == ['test']
`TEST = 'test' in sys.argv`
产生相同的效果,但更易于阅读 :-) - Herberth AmaralTESTING = sys.argv[1] == 'test'
有什么原因吗?我认为这完全相同且更简单易懂。 - glarrain[1:2]
)意味着如果 sys.argv
的元素少于两个,您不会收到索引越界错误。请注意,翻译过程中不得添加解释或其他内容。 - brianmearns所选答案是一个巨大的hack. :)
一个不那么巨大的hack是创建你自己的TestSuiteRunner子类并更改设置或进行其他必要的操作以供应用程序的其余部分使用。您可以在设置中指定测试运行程序:
TEST_RUNNER = 'your.project.MyTestSuiteRunner'
一般来说,你不想这样做,但如果你确实需要,它可以起作用。
一般而言不建议这么做,但如果你确实需要,这个方法是可行的。
from django.conf import settings
from django.test.simple import DjangoTestSuiteRunner
class MyTestSuiteRunner(DjangoTestSuiteRunner):
def __init__(self, *args, **kwargs):
settings.IM_IN_TEST_MODE = True
super(MyTestSuiteRunner, self).__init__(*args, **kwargs)
注意:自 Django 1.8 版本开始,DjangoTestSuiteRunner
已被弃用。
您应该使用 DiscoverRunner
替代:
from django.conf import settings
from django.test.runner import DiscoverRunner
class MyTestSuiteRunner(DiscoverRunner):
def __init__(self, *args, **kwargs):
settings.IM_IN_TEST_MODE = True
super(MyTestSuiteRunner, self).__init__(*args, **kwargs)
django.conf.settings
,请参考:https://docs.djangoproject.com/en/1.11/topics/settings/#altering-settings-at-runtime。 - David Avsajanishvilimanage.py test
替换为pytest
等其他方式并不特别健壮。 - Alper我不太确定你的使用情况,但我看到一种检测测试套件运行的方法是检查django.core.mail
是否具有outbox
属性,例如:
from django.core import mail
if hasattr(mail, 'outbox'):
# We are in test mode!
pass
else:
# Not in test mode...
pass
这个属性是由Django测试运行程序在setup_test_environment
中添加的,并在teardown_test_environment
中删除。你可以在这里检查源代码: https://code.djangoproject.com/browser/django/trunk/django/test/utils.py
编辑:如果您想为测试定义模型,那么您应该查看Django票号#7835,特别是以下部分:评论#24。其中部分如下:
显然,您可以直接在tests.py中定义模型。 Syncdb永远不会导入tests.py,因此这些模型不会同步到正常数据库,但是它们将被同步到测试数据库,并且可以在测试中使用。
我正在使用 settings.py 的覆盖方式。我有一个包含大部分设置的全局 settings.py 文件,然后我为其提供了一些覆盖。每个设置文件都以以下方式开始:
from myproject.settings import settings
然后继续覆盖一些设置。
然后我可以在基本的settings.py中定义UNIT_TESTS=False,并在test_settings.py中将其重写为UNIT_TESTS=True。
然后每当我运行命令时,我需要决定针对哪些设置运行(例如 DJANGO_SETTINGS_MODULE=myproject.test_settings ./manage.py test
)。我喜欢这种清晰易懂的方式。
好的,您可以简单地使用环境变量来实现这一点:
```export MYAPP_TEST=1 && python manage.py test
然后在您的settings.py
文件中:
import os
TEST = os.environ.get('MYAPP_TEST')
if TEST:
# Do something
sys.argv[1:2] == ["test"]
)。DATABASE
名称将更改为类似 "test_*" 的内容(DATABASE 默认名称将以 test 为前缀),或者您可以简单地打印它以找到运行测试时的数据库名称。由于我在我的一个项目中使用了 pytest,因此我无法使用sys.argv[1:2] == ["test"]
因为这个参数原本并不存在。所以我使用此参数来检查是否处于测试环境中(您知道你的DATABASE
名称是否已以test作为前缀,如果不是,则将test更改为DATABASE
名称的前缀部分):
1)除了设置模块外的任何地方
from django.conf import settings
TESTING_MODE = "test" in settings.DATABASES["default"]["NAME"]
2) 在设置模块内部
TESTING_MODE = "test" in DATABASES["default"]["NAME"]
或者
TESTING_MODE = DATABASES["default"]["NAME"].startswith("test") # for more strict checks
settings.py
模块中导入sys
来检查此模式。IS_TESTING = 'test' in sys.argv
的解决方案,这个方案更易于阅读。这是一个非常好的开箱即用的解决方案! - YetAnotherDuckIN_TEST = 'testserver' in settings.ALLOWED_HOSTS
我一直在使用Django 基于类的设置。我使用该软件包中的“switcher”并为testing=True
加载不同的配置/类:
switcher.register(TestingSettings, testing=True)
BaseSettings
,ProductionSettings
,DevelopmentSettings
,TestingSettings
等。 它们按需彼此子类化。 在BaseSettings
中,我有IS_TESTING=False
,然后在TestingSettings
中,我将其设置为True
。import *
方法更有效。