django – 如何检测testing环境
这个问题似乎很简单,但不幸的是,它有点难以谷歌。
我的问题是这样的:我怎么能在一个视图中检测到它在testing环境中被调用?
#pseudo_code def my_view(request): if not request.is_secure() and not TEST_ENVIRONMENT: return HttpResponseForbidden()
把它放在你的settings.py中:
import sys TESTING = len(sys.argv) > 1 and sys.argv[1] == 'test'
这testing第二个命令行参数( ./manage.py
之后)是否被test
。 然后你可以从其他模块访问这个variables,如下所示:
from django.conf import settings if settings.TESTING: ...
有很好的理由这样做:假设你正在访问一些后端服务,而不是Django的模型和数据库连接。 那么您可能需要知道何时调用生产服务与testing服务。
创build您自己的TestSuiteRunner子类,并更改设置,或为应用程序的其余部分执行任何其他所需的操作。 您在您的设置中指定testing运行器:
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)
只要看看request.META['SERVER_NAME']
def my_view(request): if request.META['SERVER_NAME'] == "testserver": print "This is test environment!"
我认为最好的方法是使用自己的设置文件(例如settings / tests.py)来运行testing。 该文件可以像这样(第一行从local.py设置文件导入设置):
from local import * TEST_MODE = True
然后做ducktyping来检查你是否处于testing模式。
try: if settings.TEST_MODE: print 'foo' except AttributeError: pass
Django中还有一种方法可以暂时覆盖unit testing中的设置。 对于某些情况,这可能是一个更简单/更干净的解决方
你可以在testing中做到这一点:
with self.settings(MY_SETTING='my_value'): # test code
或者在testing方法中添加它作为装饰器:
@override_settings(MY_SETTING='my_value') def test_my_test(self): # test code
您还可以为整个testing用例类设置装饰器:
@override_settings(MY_SETTING='my_value') class MyTestCase(TestCase): # test methods
有关更多信息,请查阅Django文档: https : //docs.djangoproject.com/en/1.11/topics/testing/tools/#django.test.override_settings
捎带@ Tobia的答案,我认为这是更好的settings.py像这样实现:
import sys try: TESTING = 'test' == sys.argv[1] except IndexError: TESTING = False
这将防止它捕捉像./manage.py loaddata test.json
或./manage.py i_am_not_running_a_test