跳转到主要内容

Pytest插件,用于随机排序测试和控制random.seed。

项目描述

https://img.shields.io/github/actions/workflow/status/pytest-dev/pytest-randomly/main.yml?branch=main&style=for-the-badge https://img.shields.io/badge/Coverage-100%25-success?style=for-the-badge https://img.shields.io/pypi/v/pytest-randomly.svg?style=for-the-badge https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge pre-commit
Randomness power.

Pytest插件,用于随机排序测试和控制random.seed

特性

所有这些特性默认开启,但可以通过标志来禁用。

  • 随机打乱测试项的顺序。这首先在模块级别进行,然后是在测试类级别(如果有的话),最后是在函数顺序上。这也适用于像doctests这样的东西。

  • 在每个测试用例和测试开始时重置全局random.seed()到一个固定的数字 - 默认为测试运行开始时的time.time(),但您可以通过传递--randomly-seed来重复由随机性引起的失败。

  • 如果已安装factory boy,则其随机状态将在每个测试开始时重置。这允许重复使用其随机的“模糊”功能。

  • 如果已安装faker,则其随机状态将在每个测试开始时重置。这也是为了测试中重复的模糊数据 - factory boy使用faker处理大量数据。如果您使用的是faker pytest fixture,通过定义faker_seed fixture(文档)也会这样做。

  • 如果已安装Model Bakery,则其随机状态将在每个测试开始时重置。这允许重复使用其随机 fixture 字段值。

  • 如果已安装numpy,则其 numpy.random 中的传统全局随机状态将在每个测试开始时重置。

  • 如果使用额外的随机生成器,它们可以在 pytest_randomly.random_seeder 入口点下注册,并在每个测试开始时重置其种子。注册一个接受当前种子值的函数。

  • pytest-xdist兼容。

关于

测试中的随机性可以非常强大,可以发现测试本身隐藏的缺陷,并为您的系统提供更多的覆盖率。

通过随机排序测试,减少了测试间意外依赖性的风险 - 这是一个在许多地方使用的技术,例如Google的C++测试运行器googletest。研究表明,“在实际中确实存在依赖性测试”并且随机执行顺序可以有效地检测此类依赖性[1]。或者,您可以使用pytest-reverse提供的反向执行顺序,这可能会找到较少依赖性的测试,但可以更好地实现效益/成本比。

通过将随机种子重置为每个测试的可重复数字,测试可以基于随机数字创建数据,同时保持可重复性,例如factory boy的模糊值。这对于确保测试指定所需的数据,以及测试系统不受未指定而随机填充的数据的影响是有益的。

我撰写了一篇博客文章,介绍了pytest-randomly的历史,包括它最初是如何作为nose插件nose-randomly开始的。

此外,我在Test and Code播客中讨论了pytest-randomly

安装

使用以下命令安装:

python -m pip install pytest-randomly

支持Python 3.8到3.12。


测试Django项目?查看我的书籍Speed Up Your Django Tests,其中涵盖了大量编写更快、更准确测试的方法。


使用

当您运行pytest时,pytest将自动找到插件并使用它。输出将首先显示一行额外的信息,告知您正在使用哪个随机种子

$ pytest
...
platform darwin -- Python ...
Using --randomly-seed=1553614239
...

如果测试由于顺序或随机创建的数据而失败,您可以使用以下标志重新启动它们:

pytest --randomly-seed=1234

或者更方便地,使用特殊值last

pytest --randomly-seed=last

(此功能仅在pytest的cacheprovider插件未被禁用时有效。)

由于排序是按模块进行的,然后是按类进行的,您可以通过缩小正在运行的测试来调试测试间污染失败,例如通过仅重新运行模块/类来找到不良交互

pytest --randomly-seed=1234 tests/module_that_failed/

您可以使用以下标志禁用您不喜欢的功能

  • --randomly-dont-reset-seed - 在每次测试开始时关闭 random.seed() 的重置

  • --randomly-dont-reorganize - 关闭测试顺序的随机打乱

该插件在 Pytest 中的名称为 'randomly'。要完全禁用它,可以使用 -p 参数,例如

pytest -p no:randomly

入口点

如果你在第三方包中使用不同的随机数生成器,你可以在每次 pytest-randomly 重置种子时注册一个入口点。实现入口点 pytest_randomly.random_seeder,参考一个接受一个参数(整数)的函数/可调用对象。

例如在你的 setup.cfg 文件中

[options.entry_points]
pytest_randomly.random_seeder =
    mypackage = mypackage.reseed

然后实现 reseed(new_seed)

参考资料

项目详情


下载文件

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

源代码分布

pytest_randomly-3.15.0.tar.gz (21.7 kB 查看散列值)

上传时间

构建分布

pytest_randomly-3.15.0-py3-none-any.whl (8.7 kB 查看散列值)

上传时间 Python 3

支持者

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