代码之家  ›  专栏  ›  技术社区  ›  tback Acorbe

django-如何检测测试环境

  •  47
  • tback Acorbe  · 技术社区  · 15 年前

    问题似乎很简单,但不幸的是,谷歌搜索有点困难。

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

    #pseudo_code
    def my_view(request):
        if not request.is_secure() and not TEST_ENVIRONMENT:
            return HttpResponseForbidden()
    
    6 回复  |  直到 12 年前
        1
  •  113
  •   Tobia    11 年前

    把这个放到你的设置中.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的模型和DB连接。然后您可能需要知道何时调用生产服务与测试服务。

        2
  •  17
  •   Travis Jensen    13 年前

    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)
    
        3
  •  14
  •   Tomasz Karbownicki    14 年前

    request.META['SERVER_NAME']

    def my_view(request):
        if request.META['SERVER_NAME'] == "testserver":
            print "This is test environment!"
    
        4
  •  6
  •   pymarco    12 年前

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

    from local import *
    TEST_MODE = True
    

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

    try:
        if settings.TEST_MODE:
            print 'foo'
    except AttributeError:
        pass
    
        5
  •  5
  •   gitaarik    9 年前

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

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

    或者将其作为decorator添加到测试方法中:

    @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

        6
  •  1
  •   Cory    13 年前

    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

        7
  •  1
  •   sg2002    7 年前

    虽然没有官方的方法来判断我们是否处于测试环境中,但django实际上给我们留下了一些线索。 默认情况下,Djangos测试运行程序 automatically redirects all Django-sent email to a dummy outbox EMAIL_BACKEND 在调用的函数中 setup_test_environment ,它又称为 method

    一个不那么复杂的解决方案是遵循devs的领导,通过子类化DisoverRunner添加我们自己的设置,然后重写setup_test_environment方法。

        8
  •  0
  •   Melvin    6 年前

    如果您是不同环境的多个设置文件,则只需创建一个设置文件进行测试。

    例如,您的设置文件是:

    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