Pytest插件,用于随机排序测试和控制random.seed。
项目描述
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 的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | b908529648667ba5e54723088edd6f82252f540cc340d748d1fa985539687047 |
|
MD5 | 49ba7643e60ff56b2b913b2245bc5fe9 |
|
BLAKE2b-256 | c9d46e924a0b2855736d942703dec88dfc98b4fe0881c8fa849b6b0fbb9182fa |
pytest_randomly-3.15.0-py3-none-any.whl 的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 0516f4344b29f4e9cdae8bce31c4aeebf59d0b9ef05927c33354ff3859eeeca6 |
|
MD5 | 241c521bf787134c50ac3895350d26c8 |
|
BLAKE2b-256 | 24d300e575657422055c4ea220b2f80e8cc6026ab7130372b7067444d1b0ac10 |