【问题标题】:How do you set DEBUG to True when running a Django test?运行 Django 测试时如何将 DEBUG 设置为 True?
【发布时间】:2011-11-18 19:33:11
【问题描述】:

我目前正在运行一些 Django 测试,默认情况下看起来是 DEBUG=False。有没有办法运行特定的测试,我可以在命令行或代码中设置DEBUG=True

【问题讨论】:

  • 根据docs.djangoproject.com/en/1.3/topics/testing/…,测试集DEBUG=False。我正在寻找一种绕过它的方法。即使我在settings.py 中通过DEBUG=True,它也会在运行测试时恢复为False
  • 没关系,我可以在setUp下设置settings.DEBUG = True

标签: django


【解决方案1】:

对于测试用例中的特定测试,您可以使用 override_settings 装饰器:

from django.test.utils import override_settings
from django.conf import settings
class TestSomething(TestCase):
    @override_settings(DEBUG=True)
    def test_debug(self):
        assert settings.DEBUG

【讨论】:

【解决方案2】:

Starting with Django 1.11 您可以在运行测试之前使用--debug-mode 将 DEBUG 设置设置为 True。

【讨论】:

    【解决方案3】:

    接受的答案对我不起作用。我使用 Selenium 进行测试,并设置 @override_settings(DEBUG=True) 使测试浏览器始终在每个页面上显示 404 错误。并且DEBUG=False 不显示异常回溯。所以我找到了解决方法。

    这个想法是模拟DEBUG=True 的行为,使用自定义的500 处理程序和内置的django 500 错误处理程序。

    1. 将此添加到 myapp.views:

      import sys
      from django import http
      from django.views.debug import ExceptionReporter
      
      def show_server_error(request):
          """
          500 error handler to show Django default 500 template
          with nice error information and traceback.
          Useful in testing, if you can't set DEBUG=True.
      
          Templates: `500.html`
          Context: sys.exc_info() results
           """
          exc_type, exc_value, exc_traceback = sys.exc_info()
          error = ExceptionReporter(request, exc_type, exc_value, exc_traceback)
          return http.HttpResponseServerError(error.get_traceback_html())
      
    2. urls.py:

      from django.conf import settings
      
      if settings.TESTING_MODE:
          # enable this handler only for testing, 
          # so that if DEBUG=False and we're not testing,
          # the default handler is used
          handler500 = 'myapp.views.show_server_error'
      
    3. settings.py:

      # detect testing mode
      import sys
      TESTING_MODE = 'test' in sys.argv
      

    现在,如果您的任何 Selenium 测试遇到 500 错误,您将看到一个漂亮的错误页面,其中包含回溯和所有内容。如果您运行的是普通的非测试环境,则使用默认的 500 处理程序。

    灵感来源:

    【讨论】:

      【解决方案4】:

      好吧,假设您想为错误测试用例编写测试,其 url 是:-

      urls.py

      if settings.DEBUG:
          urlpatterns += [
              url(r'^404/$', page_not_found_view),
              url(r'^500/$', my_custom_error_view),
              url(r'^400/$', bad_request_view),
              url(r'^403/$', permission_denied_view),
          ] 
      

      test_urls.py:-

      from django.conf import settings
      
      class ErroCodeUrl(TestCase):
      
          def setUp(self):
              settings.DEBUG = True
      
          def test_400_error(self):
              response = self.client.get('/400/')
              self.assertEqual(response.status_code, 500)
      

      希望您有所了解!

      【讨论】:

      • @override_settings 应该用于在下一次测试之前“展开”更改。
      【解决方案5】:

      除了https://stackoverflow.com/a/1118271/5750078,没有什么对我有用 使用 Python 3.7

      breakpoint() 
      

      方法。 在 pycharm 上运行良好

      【讨论】:

      • 这个问题是关于如何在运行单元测试时设置/覆盖特定的 Django 设置 - 在本例中为 DEBUG。您的 qnswer 和您提供的讨论链接是关于调试的。
      【解决方案6】:

      运行单元测试时看不到DEBUG=True 的结果。页面不会显示在任何地方。没有浏览器。

      更改DEBUG 无效,因为网页(带有调试输出)在任何地方都不可见。

      如果您想查看与失败的单元测试相关的调试网页,请执行此操作。

      1. 删除您的开发数据库。

      2. 重新运行 syncdb 以构建一个空的开发数据库。

      3. 运行各种loaddata 脚本以在您的开发数据库中重建该测试的固定装置。

      4. 运行服务器并浏览页面。

      现在您可以看到调试输出了。

      【讨论】:

      • 我意识到这是一篇较旧的帖子,但想要DEBUG=True 的一个很好的理由是查看来自tastepie REST api 的消息,它只显示DEBUG=TrueTASTYPIE_FULL_DEBUG=True 的消息。
      • 此外,当使用 selenium 时,您确实会显示网页。如果在构建测试时出现问题,您可能希望看到实际的错误消息。
      • 设置 DEBUG=True 还允许您打印从 django.db.connection.queries 生成的 SQL,这有助于设计测试以涵盖奇怪的边缘情况。
      猜你喜欢
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      相关资源
      最近更新 更多