【问题标题】:How can I unit test Sentry's before_send callback?如何对 Sentry 的 before_send 回调进行单元测试?
【发布时间】:2020-07-15 08:33:26
【问题描述】:

我想编写一个 strip_sensitive_data 函数并将其传递给 Sentry 的 before_send 回调,如他们自己的文档中的示例 https://docs.sentry.io/error-reporting/configuration/filtering/?platform=python

import sentry_sdk

def strip_sensitive_data(event, hint):
    # modify event here
    return event

sentry_sdk.init(
    before_send=strip_sensitive_data
)

我正在开发一个 Django 应用程序,并希望找到一种方法来使用 Django TestCase 修补或模拟此回调。有没有简单的方法来做到这一点?

【问题讨论】:

    标签: python django unit-testing django-testing sentry


    【解决方案1】:

    我遇到了同样的问题,就我而言,我想将 ConnectionError 和 HTTPError 与代码 503 组合在一起,因为我对它们无能为力。这是我想出的:

    @pytest.fixture
    def sentry_init():
        # set up sentry sdk here
    
    @pytest.mark.parametrize(
        "exception, expected_fingerprint",
        [
            (ConnectionError, ["connection-error"]),
            (HTTPError("503 ..."), ["connection-error"]),
            (HTTPError("400 ..."), None), # In this case no fingerprint, I don't want any grouping
        ],
    )
    def test_sentry_before_send(
        monkeypatch, sentry_init, exception, expected_fingerprint  # pylint: disable=unused-argument
    ):
        sentry_client = sentry_sdk.Hub.current.client
        transport = MagicMock()
        monkeypatch.setattr(sentry_client, "transport", transport)
    
        sentry_sdk.capture_exception(exception)
    
        if expected_fingerprint is not None:
            assert transport.method_calls[0].args[0]["fingerprint"] == expected_fingerprint
        else:
            assert "fingerprint" not in transport.method_calls[0].args[0].keys()
    

    传输用于向哨兵发送事件。因此,通过模拟它,您可以在before_send 以及add_breadcrumbs 等中测试您所做的任何处理...

    我查看了 sdk 测试以找出答案,以防万一

    【讨论】:

      猜你喜欢
      • 2016-09-12
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 2022-11-04
      • 2019-11-02
      • 1970-01-01
      相关资源
      最近更新 更多