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