在django测试运行期间避免在404上发出警告?

时间:2011-06-16 19:09:49

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

刚升级到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(我们期望)会触发对控制台的警告:

。警告未找到:/ foo / bar2 /

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

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

3 个答案:

答案 0 :(得分:14)

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

你想要做的是在测试开始时将'django.request'模块的记录阈值设置为高于WARNING的值(例如ERROR),然后再将其设置回来。

尝试这样的事情:

import logging

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

#after tests
logger.setLevel(previous_level)

答案 1 :(得分:6)

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

基于@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)

答案 2 :(得分:0)

实现@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 类,其中包含检查未找到页面的测试。