我的 Django 应用程序中有一个测试。它们运行良好,但我想禁用显示控制台日志记录,例如
.Bad Request: /api/v1/users/register/
我的一个测试代码
def test_user_register_username_error(self):
data = {
'username': 'us',
'email': '[email protected]',
'password': 'pass123123',
'password_again': 'pass123123'
}
url = self.register_url
response = client.post(url, data=data)
self.assertEqual(response.status_code, 400)
self.assertFalse(User.objects.filter(username='us').first())
控制台输出
Found 1 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.Bad Request: /api/v1/users/register/
----------------------------------------------------------------------
Ran 1 tests in 0.414s
OK
一切正常,但我想禁用
Bad Request: /api/v1/users/register/
输出到控制台。我仔细检查过,没有 print
或 logging
功能可以将其记录到控制台。
如何在测试时禁用诸如
Bad Request: /api/v1/users/register/
记录之类的消息
为了使问题更容易理解,这是当前的控制台输出:
Found 22 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
...........Bad Request: /api/v1/users/register/
.Bad Request: /api/v1/users/register/
.Bad Request: /api/v1/users/register/
.Bad Request: /api/v1/users/register/
.Bad Request: /api/v1/users/register/
..Bad Request: /api/v1/users/register/
.Bad Request: /api/v1/users/activate/
.Bad Request: /api/v1/users/login/
.Bad Request: /api/v1/users/recovery/
Bad Request: /api/v1/users/recovery/
.Bad Request: /api/v1/users/register/
.
----------------------------------------------------------------------
Ran 22 tests in 6.350s
OK
我的期望是:
Found 22 test(s).
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
......................
----------------------------------------------------------------------
Ran 22 tests in 6.350s
OK
您只能在测试期间记录错误,完成后返回正常的日志记录级别。
class SampleTestCase(TestCase):
def setUp(self) -> None:
"""Reduce the log level to avoid messages like 'bad request'"""
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)
我将发布有用的解决方案:https://betterstack.com/community/questions/how-to-disable-logging-while-running-django-unit-tests/
您可以使用过滤器来实现这一点。在
settings.py
中添加:
from logging import Filter
class NotInTestingFilter(Filter):
def filter(self, record):
from django.conf import settings
return not settings.TESTING_MODE
并在
LOGGING
内的settings.py
变量(https://docs.djangoproject.com/en/5.0/topics/logging/)添加:
"filters": {
"testing": {"()": NotInTestingFilter},
},
"loggers": {
"django.request": {
"handlers": ["console"],
"level": "ERROR",
"filters": ["testing"],
"propagate": False,
},
}