django - 如何检测测试环境

时间:2010-11-03 14:46:39

标签: django unit-testing

这个问题看起来很简单,但不幸的是谷歌有点困难。

我的问题是:如何在视图中检测到它是否在测试环境中被调用?

#pseudo_code
def my_view(request):
    if not request.is_secure() and not TEST_ENVIRONMENT:
        return HttpResponseForbidden()

8 个答案:

答案 0 :(得分:105)

将它放在settings.py中:

import sys

TESTING = len(sys.argv) > 1 and sys.argv[1] == 'test'

这将测试第二个命令行参数(./manage.py之后)是否为test。然后,您可以从其他模块访问此变量,如下所示:

from django.conf import settings

if settings.TESTING:
    ...

有充分的理由这样做:假设你正在访问一些后端服务,而不是Django的模型和数据库连接。然后,您可能需要知道何时调用生产服务与测试服务。

答案 1 :(得分:16)

创建自己的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)

答案 2 :(得分:14)

只需查看request.META['SERVER_NAME']

即可
def my_view(request):
    if request.META['SERVER_NAME'] == "testserver":
        print "This is test environment!"

答案 3 :(得分:6)

我认为最好的方法是使用自己的设置文件(即settings / tests.py)运行测试。该文件可能如下所示(第一行从local.py设置文件导入设置):

from local import *
TEST_MODE = True

然后执行ducktyping以检查您是否处于测试模式。

try:
    if settings.TEST_MODE:
        print 'foo'
except AttributeError:
    pass

答案 4 :(得分:5)

还有一种方法可以暂时覆盖Django中单元测试中的设置。对于某些情况,这可能是一种更简单/更清洁的解决方案。

您可以在测试中执行此操作:

with self.settings(MY_SETTING='my_value'):
    # test code

或者将其添加为测试方法的装饰器:

@override_settings(MY_SETTING='my_value')
def test_my_test(self):
    # test code

您还可以为整个测试用例类设置装饰器:

@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

答案 5 :(得分:1)

回顾@ 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

等内容

答案 6 :(得分:0)

虽然没有正式的方法可以查看我们是否处于测试环境中,但Django实际上为我们留下了一些线索。 默认情况下,Django的测试运行器automatically redirects all Django-sent email to a dummy outbox。这可以通过在名为EMAIL_BACKEND的函数中替换setup_test_environment来实现,该函数依次由DiscoverRunner的method调用。因此,我们可以检查settings.EMAIL_BACKEND是否设置为'django.core.mail.backends.locmem.EmailBackend'。这意味着我们正在测试环境中。

一种不太hacky的解决方案是通过继承DisoverRunner的子类,然后覆盖setup_test_environment方法来添加我们自己的设置,以遵循开发人员的指导。

答案 7 :(得分:0)

如果您是针对不同环境的多个设置文件,那么您要做的就是创建一个用于测试的设置文件。

例如,您的设置文件是:

your_project/
      |_ settings/
           |_ __init__.py
           |_ base.py  <-- your original settings
           |_ testing.py  <-- for testing only

在您的testing.py中,添加一个TESTING标志:

from .base import *

TESTING = True

在您的应用程序中,您可以访问settings.TESTING来检查您是否在测试环境中。

要运行测试,请使用:

python manage.py test --settings your_project.settings.testing