保存之前的测试运行,并允许重新执行之前的pytest运行以重现崩溃或不可靠的测试
项目描述
保存之前的测试运行,并允许重新执行之前的pytest运行以重现崩溃或不可靠的测试
此 pytest 插件是用 Cookiecutter 以及 @hackebrot 的 Cookiecutter-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)
pytest 有自己的缓存,为什么还要使用不同的机制?
内部缓存使用 json 存储数据,但这在发生崩溃时不适用,因为文件将无法读取。
选择文件中的测试的能力不应该成为 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
版本发布
按照以下步骤发布新版本:
从 master 创建一个新分支 release-X.Y.Z;
更新 CHANGELOG.rst;
提交一个 PR;
在它被标记为 green 并 approved 后,推送一个新的格式为 X.Y.Z 的标签;
GitHub Actions 将自动部署到 PyPI。
之后,更新 conda-forge/pytest-replay-feedstock 中的配方。
许可证
根据 MIT 许可证发布。
问题
如果您遇到任何问题,请提供详细的描述,并在 GitHub 上提交问题。