跳转到主要内容

pytest插件,用于将测试运行信息发送到Sentry.io

项目描述

https://img.shields.io/pypi/v/pytest-sentry https://img.shields.io/pypi/l/pytest-sentry

pytest-sentry是一个使用Sentry存储和聚合测试运行信息的pytest插件。

这不是Sentry的官方产品。

跟踪不可靠测试作为错误

假设您有一个包含一些不可靠测试的测试套件,这些测试可能由于网络问题、竞态条件或其他您不想立即修复的问题而随机中断您的CI构建。已知的解决方案是自动重试这些测试,例如使用pytest-rerunfailures

对于此类插件的一个担忧是,它们只是隐藏了测试套件或甚至其他代码中的错误。毕竟,您的CI构建是绿色的,并且代码很可能大多数时候都能正常工作。

pytest-sentry通过在您的构建状态之外跟踪不可靠测试失败,使该选择更容易一些。Sentry已经是监控生产环境中所有种类错误(重要或不重要)的好选择,因此让我们尝试在测试套件中使用它。

前提条件是您已经在CI中使用过 pytestpytest-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 设置为介于 01 之间的浮点数。这将导致只有随机样本的事务被发送到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 (8.9 kB 查看哈希值)

上传时间

构建分发

pytest_sentry-0.3.0-py3-none-any.whl (8.1 kB 查看哈希值)

上传时间 Python 3

支持者