pytest插件,用于将测试运行信息发送到Sentry.io
项目描述
pytest-sentry是一个使用Sentry存储和聚合测试运行信息的pytest插件。
这不是Sentry的官方产品。
跟踪不可靠测试作为错误
假设您有一个包含一些不可靠测试的测试套件,这些测试可能由于网络问题、竞态条件或其他您不想立即修复的问题而随机中断您的CI构建。已知的解决方案是自动重试这些测试,例如使用pytest-rerunfailures。
对于此类插件的一个担忧是,它们只是隐藏了测试套件或甚至其他代码中的错误。毕竟,您的CI构建是绿色的,并且代码很可能大多数时候都能正常工作。
pytest-sentry通过在您的构建状态之外跟踪不可靠测试失败,使该选择更容易一些。Sentry已经是监控生产环境中所有种类错误(重要或不重要)的好选择,因此让我们尝试在测试套件中使用它。
前提条件是您已经在CI中使用过 pytest 和 pytest-rerunfailures。现在安装 pytest-sentry 并将环境变量 PYTEST_SENTRY_DSN 设置为新Sentry项目的DSN。
现在,每次通过重试测试而“修复”的测试失败都会报告给Sentry,但仍然不会中断CI。连续失败的测试将不会报告。
跟踪测试套件的性能
默认情况下,pytest-sentry 将将性能数据发送到Sentry
固定设置被报告为“事务”到Sentry,这样您就可以回答诸如“我的最慢的测试固定装置是什么”和“我的最常使用的测试固定装置是什么”等问题。
对测试函数本身的调用被报告为单独的事务,这样您也可以找到大型的、慢速的测试。
与特定测试项相关的固定设置将处于同一跟踪中,即具有相同的跟踪ID。尽管没有共同的父事务。这有意被省略以节省配额,因为它不包含有趣的信息
pytest.runtest.protocol [one time, not sent] pytest.fixture.setup [multiple times, sent] pytest.runtest.call [one time, sent]
跟踪是针对测试项的。为了在整个测试运行中关联事务,请使用自动附加的CI标签或自己附加一些标签。
为了测量性能数据,安装 pytest-sentry 并设置 PYTEST_SENTRY_DSN,就像设置错误一样。默认情况下,该扩展将所有性能数据发送到Sentry。如果您想限制发送的数据量,可以将环境变量 PYTEST_SENTRY_TRACES_SAMPLE_RATE 设置为介于 0 和 1 之间的浮点数。这将导致只有随机样本的事务被发送到Sentry。
事务可能会在报告错误之外产生明显的运行时开销。要禁用,请使用标记
import pytest import pytest_sentry pytestmarker = pytest.mark.sentry_client({"traces_sample_rate": 0.0})
高级选项
pytest-sentry 支持为每个测试标记使用不同的DSN、客户端或作用域。您可以使用此功能为Python的Sentry SDK中的 Client 对象提供自定义选项
import random import pytest from sentry_sdk import Scope from pytest_sentry import Client @pytest.mark.sentry_client(None) def test_no_sentry(): # Even though flaky, this test never gets reported to sentry assert random.random() > 0.5 @pytest.mark.sentry_client("MY NEW DSN") def test_custom_dsn(): # Use a different DSN to report errors for this one assert random.random() > 0.5 # Other invocations: @pytest.mark.sentry_client(Client("CUSTOM DSN")) @pytest.mark.sentry_client(lambda: Client("CUSTOM DSN")) @pytest.mark.sentry_client(Scope(Client("CUSTOM DSN"))) @pytest.mark.sentry_client({"dsn": ..., "debug": True})
pytest-sentry 提供的 Client 类仅具有不同的默认集成。它禁用了某些错误捕获集成,以避免将随机预期错误发送到您的项目中。
访问使用的Sentry客户端
您会注意到全局函数,如 sentry_sdk.capture_message,实际上不会将事件发送到您为该插件配置的同一DSN。这是因为 pytest-sentry 尽最大努力保持其自己的SDK设置与测试代码的SDK设置分开。
pytest-sentry 提供了 sentry_test_scope 固定装置,其返回值是用于向Sentry发送事件的 Scope。使用 with use_scope(entry_test_scope): 临时切换上下文。您可以使用此功能设置自定义标签,如下所示
def test_foo(sentry_test_scope): with use_scope(sentry_test_scope): sentry_sdk.set_tag("pull_request", os.environ['EXAMPLE_CI_PULL_REQUEST'])
为什么要这么麻烦地使用上下文管理器?想象一下,如果您的测试应用会开始记录一些(预期的)错误。您会立即超出配额!
始终报告测试失败
您可以通过设置环境变量 PYTEST_SENTRY_ALWAYS_REPORT=1 来始终将所有测试失败报告给Sentry。
这可以在 main 或发布分支的构建上启用,以捕获某些类型的测试在构建之间是脆弱的,但在单个测试运行中始终失败或通过。
许可证
许可协议为2条款BSD,请参阅 LICENSE。
项目详情
pytest_sentry-0.3.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d26fb87d306a3b51ed3de40d2ccef2fb856438f04dcb93c8b44a54f9c09f1e20 |
|
MD5 | ceddf20ad9b9bb9c948a696d12b4a199 |
|
BLAKE2b-256 | 7c7b79ecce6640882fab9c327debef1ff4a834ac33dbb79f8adc267f4bfbebe0 |
pytest_sentry-0.3.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ae182f11c18179533d4d760fd79f1992cc351062e69d253297a4cc7639535db7 |
|
MD5 | e48d73194f6b8d8340780cd7aa789630 |
|
BLAKE2b-256 | a2a6a7645df6aa1e3b37c1330e006f8a2f48ba7ecab24cab700fa8120ffdb9e8 |