在 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 命令期间运行了哪些测试