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

Posted

技术标签:

【中文标题】在 django 测试运行期间避免出现 404 警告?【英文标题】:Avoid warnings on 404 during django test runs? 【发布时间】: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”记录器中过滤掉所有警告。

【问题讨论】:

【参考方案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() 中添加了关卡设置/恢复。约翰,你什么时候开始? ;)

以上是关于在 django 测试运行期间避免出现 404 警告?的主要内容,如果未能解决你的问题,请参考以下文章

如何查看在 Django 的 manage.py test 命令期间运行了哪些测试

Laravel 路由仅在 phpunit 测试期间返回 302 而不是 404 响应

django 测试期间数据库创建失败

Django 在测试期间无法刷新数据库

Scikit-Learn:在交叉验证期间避免数据泄漏

人脸 API - Person Group PUT 操作期间出现错误 404