【问题标题】:Avoid warnings on 404 during django test runs?在 django 测试运行期间避免出现 404 警告?
【发布时间】:2011-09-16 15:51:26
【问题描述】:

刚刚升级到 Django 1.3。每次我检查给定 URL 是否为 404 时,我的测试套件现在都会显示一堆类似这样的无用警告。在 Django 1.2 下它没有这样做。

例如,假设我们连接了视图和 URL,以便通过此测试:

def test_foo(self):
    response = self.client.get('/foo/bar/')
    self.assertEqual(response.status_code, 200)
    response = self.client.get('/foo/bar2/')
    self.assertEqual(response.status_code, 404)

虽然测试通过了,但 404(我们预期)会向控制台触发警告:

.WARNING 未找到:/foo/bar2/

这只是无用的噪音;我目前的一个测试套件中有大约 30 个。

有没有办法让那些在测试期间保持沉默?我想在正常操作期间让它们保持开启状态。而且我不认为我想从“django.request”记录器中过滤掉所有警告。

【问题讨论】:

    标签: django testing logging http-status-code-404


    【解决方案1】:

    实现@jterrace 的解决方案是在setUp 和tearDown 方法中降低日志级别:

    class NotFoundTests(TestCase):
        def setUp(self) -> None:
            """Reduce the log level to avoid errors like 'not found'"""
            logger = logging.getLogger("django.request")
            self.previous_level = logger.getEffectiveLevel()
            logger.setLevel(logging.ERROR)
    
        def tearDown(self) -> None:
            """Reset the log level back to normal"""
            logger = logging.getLogger("django.request")
            logger.setLevel(self.previous_level)
    

    只需复制/粘贴到 TestCase 类,其中包含检查未找到页面的测试。

    【讨论】:

      【解决方案2】:

      我知道几年过去了,但对于其他寻找这个问题的人来说,以下可能会有所帮助。

      基于@jterrace 解决方案,您可以轻松实现如下装饰器功能:

      import logging
      
      def prevent_request_warnings(original_function):
          """
          If we need to test for 404s or 405s this decorator can prevent the
          request class from throwing warnings.
          """
          def new_function(*args, **kwargs):
              # raise logging level to ERROR
              logger = logging.getLogger('django.request')
              previous_logging_level = logger.getEffectiveLevel()
              logger.setLevel(logging.ERROR)
      
              # trigger original function that would throw warning
              original_function(*args, **kwargs)
      
              # lower logging level back to previous
              logger.setLevel(previous_logging_level)
      
          return new_function
      

      使用它,您可以编写如下代码:

      @prevent_request_warnings
      def test_foo(self):
          response = self.client.get('/foo/bar/')
          self.assertEqual(response.status_code, 200)
          response = self.client.get('/foo/bar2/')
          self.assertEqual(response.status_code, 404)
      

      【讨论】:

        【解决方案3】:

        警告来自这里: http://code.djangoproject.com/svn/django/trunk/django/core/handlers/base.py

        您要做的是在测试开始时将“django.request”模块的日志记录阈值设置为高于警告(例如错误)的值,然后再将其设置回来。

        试试这样的:

        import logging
        
        #before tests
        logger = logging.getLogger('django.request')
        previous_level = logger.getEffectiveLevel()
        logger.setLevel(logging.ERROR)
        
        #after tests
        logger.setLevel(previous_level)
        

        【讨论】:

        • 是的,我希望有一个更懒惰的解决方案。这是正确的方法,但现在我将在 settings.LOGGING 中进行相同的配置。
        • 是的,问题是异常子句无论如何都会输出警告,所以不幸的是,让它停止的唯一方法是降低日志记录级别。
        • 别偷懒。我是你下一份工作后必须清理代码的可怜的混蛋。
        • 你会很高兴知道我在我的 TestCase 的 setUp() / tearDown() 中添加了关卡设置/恢复。约翰,你什么时候开始? ;)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-18
        • 2021-02-26
        相关资源
        最近更新 更多