跳转到主要内容

保存之前的测试运行,并允许重新执行之前的pytest运行以重现崩溃或不可靠的测试

项目描述

http://img.shields.io/pypi/v/pytest-replay.svg https://anaconda.org/conda-forge/pytest-replay/badges/version.svg https://github.com/ESSS/pytest-replay/workflows/test/badge.svg https://img.shields.io/pypi/pyversions/pytest-replay.svg https://img.shields.io/badge/code%20style-black-000000.svg

保存之前的测试运行,并允许重新执行之前的pytest运行以重现崩溃或不可靠的测试


pytest 插件是用 Cookiecutter 以及 @hackebrotCookiecutter-pytest-plugin 模板生成的。

功能

此插件有助于在运行测试时重现随机的或不可靠的行为。 pytest-xdist 以不可预测的顺序执行测试,这使得在本地重现CI中看到的特定行为变得困难,因为没有方便的方法来跟踪哪个测试在哪个工作器上执行。

此插件通过 --replay-record-dir=<dir> 标志记录每个工作员在指定目录中执行的节点 ID,并可以使用 --replay=<file> 来重新运行之前的测试。例如

$ pytest -n auto --replay-record-dir=build/tests/replay

这将生成包含以下内容的 json 文件,每行一个:节点标识、开始时间、结束时间和结果。值得注意的是,通常节点 ID 会重复两次,这是必要的,以防测试突然崩溃,我们仍然会有测试开始的记录。测试完成后,pytest-replay 将添加另一个 json 行,包含完整信息。这也很有用,可以分析可能存在某种竞争条件的并发测试,它们可能会相互干扰。

例如,工作员 gw1 将生成一个内容如下所示的 .pytest-replay-gw1.txt 文件

{"nodeid": "test_foo.py::test[1]", "start": 0.000}
{"nodeid": "test_foo.py::test[1]", "start": 0.000, "finish": 1.5, "outcome": "passed"}
{"nodeid": "test_foo.py::test[3]", "start": 1.5}
{"nodeid": "test_foo.py::test[3]", "start": 1.5, "finish": 2.5, "outcome": "passed"}
{"nodeid": "test_foo.py::test[5]", "start": 2.5}
{"nodeid": "test_foo.py::test[5]", "start": 2.5, "finish": 3.5, "outcome": "passed"}
{"nodeid": "test_foo.py::test[7]", "start": 3.5}
{"nodeid": "test_foo.py::test[7]", "start": 3.5, "finish": 4.5, "outcome": "passed"}
{"nodeid": "test_foo.py::test[8]", "start": 4.5}
{"nodeid": "test_foo.py::test[8]", "start": 4.5, "finish": 5.5, "outcome": "passed"}

如果工作员 gw1 的测试出现崩溃或不可靠的失败,可以从 CI 服务器获取该文件,并使用以下命令以相同的顺序执行测试

$ pytest --replay=.pytest-replay-gw1.txt

希望这会使重现问题并修复问题变得更加容易。

常见问题解答(FAQ)

  1. pytest 有自己的缓存,为什么还要使用不同的机制?

    内部缓存使用 json 存储数据,但这在发生崩溃时不适用,因为文件将无法读取。

  2. 选择文件中的测试的能力不应该成为 pytest 核心的功能吗?

    当然,但让我们先将其作为单独的插件使用一段时间,然后再提议将其纳入核心。

安装

您可以通过从 PyPI 使用 pip 来安装 pytest-replay

$ pip install pytest-replay

或者使用 conda

$ conda install -c conda-forge pytest-replay

贡献

非常欢迎贡献。

如果您使用的是本机 Python 安装,可以使用 tox 运行测试。

要使用 conda 运行测试,首先创建一个虚拟环境,然后从该环境中执行测试(在根环境中使用 conda 和 Python 3.5+)

$ python -m venv .env
$ .env\scripts\activate
$ pip install -e . pytest-xdist
$ pytest tests

版本发布

按照以下步骤发布新版本:

  1. master 创建一个新分支 release-X.Y.Z

  2. 更新 CHANGELOG.rst

  3. 提交一个 PR;

  4. 在它被标记为 greenapproved 后,推送一个新的格式为 X.Y.Z 的标签;

GitHub Actions 将自动部署到 PyPI。

之后,更新 conda-forge/pytest-replay-feedstock 中的配方。

许可证

根据 MIT 许可证发布。

问题

如果您遇到任何问题,请提供详细的描述,并在 GitHub 上提交问题。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分布

pytest_replay-1.5.2.tar.gz (12.0 kB 查看哈希值)

上传时间 源代码

构建分布

pytest_replay-1.5.2-py3-none-any.whl (6.5 kB 查看哈希值)

上传时间 Python 3

由以下组织支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页