在Django应用单元测试中禁用错误请求日志输出
问题:Django单元测试时如何禁用Bad Request日志输出
我的Django应用单元测试运行正常,但控制台会输出Bad Request: /api/v1/users/register/这类错误请求日志,干扰测试进度标识的查看。
测试代码示例
def test_user_register_username_error(self): data = { 'username': 'us', 'email': 'mail@mail.mail', '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 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
已确认代码中无自定义print或logging语句,希望禁用这类日志输出,仅保留测试进度标识。
解决方法
这些日志来自Django的django.request日志器,默认会将4xx请求输出到控制台。可通过以下方式禁用:
1. 在测试类中临时调整日志级别
在测试类的setUpClass或setUp方法中,将django.request的日志级别调高至ERROR(仅记录5xx及以上错误):
import logging from django.test import TestCase class YourUserTest(TestCase): @classmethod def setUpClass(cls): super().setUpClass() # 禁用django.request的4xx日志 logging.getLogger('django.request').setLevel(logging.ERROR)
2. 在测试专用配置中修改日志规则
如果有单独的测试环境配置文件(如settings/test.py),直接修改日志配置:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.request': { 'handlers': ['console'], 'level': 'ERROR', # 仅记录5xx级错误 'propagate': False, }, }, }
3. 用装饰器控制单个测试用例
若只需针对特定测试用例禁用日志,可编写装饰器:
import logging from functools import wraps def disable_django_request_warnings(func): @wraps(func) def wrapper(*args, **kwargs): logger = logging.getLogger('django.request') original_level = logger.level logger.setLevel(logging.ERROR) try: return func(*args, **kwargs) finally: logger.setLevel(original_level) return wrapper # 在目标测试用例上使用 class YourUserTest(TestCase): @disable_django_request_warnings def test_user_register_username_error(self): # 测试代码...
内容的提问来源于stack exchange,提问作者NelttjeN
相关产品推荐
相关产品推荐

