在失败时重放prng状态的插件。
pytest-caprng的Python项目详细描述
在失败时重放prng状态的插件。
这是为什么?
测试随机函数具有挑战性。粗略地说,发生了两件事之一:
- 你学会忽略零星的失败。例如,如果你在某个随机函数上构造了一个binomial_test,它就有可能失败。知道了这一点,你就重新运行测试;它起作用;你得出结论说没有问题。通常,这是正确的结论。但是,一遍又一遍地重复这个模式会让你看不到真正错误的代码。这使得发现错误的可能性降低。这很糟糕。
- 你的猴子修补你的prng。通常,这意味着调度实现,注入确定性。但是,这需要知道测试函数的实现细节。而且,如果这种情况改变了,测试也需要改变。这很脆弱。这使得发现错误的可能性降低。这很糟糕。
这个插件是一个折衷方案,旨在消除(2)并降低(1)的流行率。它通过再现性为您的测试提供了一些确定度。如果随机测试失败,重新运行它将导致完全相同的失败。
它是怎么工作的?
除非您有(很酷的)专用硬件,否则代码不会使用随机数。相反,它使用一个由伪随机数生成器(prng)产生的“足够随机”的确定的数字序列,每个prng都有一个内部状态。绘制样本时,状态将更改。如果将prng的状态重置回原始状态,然后再次采样,则采样将与第一个相同。这是确定性的。
这个插件利用了random和np.random底层prng的决定论。在每个测试功能之前,cap rng[cap]表示p[rng]状态。如果测试失败,插件会将捕获的状态写入缓存。然后,当您重新运行测试时,插件将查看您的测试函数是否具有任何关联的、缓存的prng状态。如果是,它会将prng状态覆盖到prior以运行测试函数,previous reproducting the failing tests prior environment。
安装
您可以通过以下方式安装“pytest caprng”:
$ pip install pytest-caprng
用法
对于基于random的状态捕获:
$ pytest --caprng-global-stdlib
对于np.random:
$ pytest --caprng-global-np
您可能应该将选项添加到pytest.ini文件中:
[pytest] addopts = –caprng-global-stdlib –caprng-global-np
这样你就不会“错过”可复制的错误。
贡献
我们非常欢迎您的贡献。测试可以使用tox运行,请确保 在提交请求之前,覆盖范围至少保持不变。
许可证
“Pytest Caprng”是根据麻省理工学院许可证条款发行的免费开源软件
问题
如果您遇到任何问题,请提交一个问题与详细说明。