代码之家  ›  专栏  ›  技术社区  ›  Kurt Peek

在Django测试中禁用空气制动通知?

  •  3
  • Kurt Peek  · 技术社区  · 6 年前

    我已经配置了一个名为 lucy_web 使用 pybrake . 在 露西网 等级制度, lucy_web.lib.session_recommendations ,我定义了一个测试函数:

    import logging
    
    logger = logging.getLogger(__name__)
    
    def log_something():
        logger.error("Logging something...")
    

    如果我从django shell调用此函数,如下所示:

    (venv) Kurts-MacBook-Pro-2:lucy-web kurtpeek$ python manage.py shell
    Python 3.6.4 (v3.6.4:d48ecebad5, Dec 18 2017, 21:07:28) 
    Type 'copyright', 'credits' or 'license' for more information
    IPython 6.3.1 -- An enhanced Interactive Python. Type '?' for help.
    
    In [1]: from lucy_web.lib.session_recommendation import *
    
    In [2]: log_something()
    

    我看到出现错误电子邮件:

    enter image description here

    但是,如果我定义了一个测试,并尝试从那里调用它,则不会出现任何新的错误实例:

    from django.test import TestCase
    from django.core import mail
    
    
    class SessionRecommendationTestCase(TestCase):
        def test_airbrake_notification_if_session_type_does_not_exist(self):
            from lucy_web.lib.session_recommendation import log_something
            log_something()
            import ipdb; ipdb.set_trace()
    

    运行此操作不会导致空气制动仪表板中出现任何新的错误实例。也, mail.outbox 为空:

    (venv) Kurts-MacBook-Pro-2:lucy-web kurtpeek$ python manage.py test lucy_web.tests.test_session_recommendation.SessionRecommendationTestCase.test_airbrake_notification_if_session_type_does_not_exist
    Creating test database for alias 'default'...
    System check identified no issues (0 silenced).
    --Return--
    None
    > /Users/kurtpeek/Documents/Dev/lucy2/lucy-web/lucy_web/tests/test_session_recommendation.py(377)test_airbrake_notification_if_session_type_does_not_exist()
        375         from lucy_web.lib.session_recommendation import log_something
        376         log_something()
    --> 377         import ipdb; ipdb.set_trace()
    
    ipdb> mail.outbox
    []
    

    据我所知 https://docs.djangoproject.com/en/2.0/topics/testing/tools/#email-services ,在测试中,django将django发送的所有电子邮件重定向到一个虚拟发件箱, 邮箱 . 不过,我不认为airbrake会出现这种情况,因为电子邮件可能是由它们的后端发送的——如果是这样,我也不认为 邮箱 空荡荡的。

    为什么我没有收到任何空气制动测试通知?是不是更一般的事情,比如在测试期间禁用/捕获所有日志记录?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Kurt Peek    6 年前

    我通过在 pybrake.Notifier send_notice 方法,它在单元测试中不会被调用,而在我从django shell“手动”调用函数时会被调用。

    为了获得测试覆盖率,我解决了这个问题,只是断言 logger.error 被调用:

    from django.test import TestCase
    from unittest.mock import patch
    
    class SessionRecommendationTestCase(TestCase):
        @patch('lucy_web.lib.session_recommendation.logger.error')
        def test_create_session_from_non_existent_session_type_title_triggers_error_logging(self, mock_error):
            title = "Being Awesome"    # Title of a non-existent session type
            _create_sessions([title])
            mock_error.assert_called_with(
                f"Tried to create a session of type '{title}', but no such session type was found in the database.")
    

    这里是我要测试的实际函数:

    def _create_sessions(title_list, starting_number=1, **kwargs):
        '''Auxiliary function to create sessions from a list of SessionType titles'''
        session_number = starting_number
        for title in title_list:
            session_type = SessionType.objects.filter(title=title).first()
            if session_type:
                Session.objects.create(
                    session_type=session_type,
                    session_number=session_number,
                    **kwargs)
                session_number += 1
            else:
                logger.error(
                    f"Tried to create a session of type "
                    f"'{title}', but no such session type was found in the database.")
    

    此测试通过:

    (venv) Kurts-MacBook-Pro-2:lucy-web kurtpeek$ python manage.py test lucy_web.tests.test_session_recommendation.SessionRecommendationTestCase.test_create_session_from_non_existent_session_type_title_triggers_error_logging
    Creating test database for alias 'default'...
    System check identified no issues (0 silenced).
    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.004s
    
    OK
    Destroying test database for alias 'default'...
    
    推荐文章