在单元测试 django 应用程序时禁用记录错误请求

问题描述 投票:0回答:2

我的 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
python django unit-testing django-rest-framework django-testing
2个回答
2
投票

您只能在测试期间记录错误,完成后返回正常的日志记录级别。

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)

0
投票

我将发布有用的解决方案: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,
        },
    }
© www.soinside.com 2019 - 2024. All rights reserved.