python - Pytest:根据假设生成总和为 1 的 float 列表

标签 python pytest hypothesis-test

对于单元测试,我想使用hypothesis 库生成float列表。有一些重要的限制:

  1. 列表中的成分股数量必须大于 1 且小于 15
  2. 最小值必须大于 0
  3. 最大值必须小于 1
  4. 所有成分之和必须恰好等于一 (1)

到目前为止,我能够满足前三个约束。

@given(
    strategies.lists(
        st.floats(min_value=0, max_value=1, exclude_min=True, exclude_max=True),
        min_size=2,
        max_size=15,
    )
)

如何满足第四个约束?

最佳答案

我认为您不能直接添加约束,但您可以调整数据以使它们满足条件,例如:

def normalize(float_list):
    s = sum(float_list)
    return [f / s for f in float_list]


@given(
    strategies.lists(
        st.floats(min_value=0, max_value=1, exclude_min=True,
                  exclude_max=True),
        min_size=2,
        max_size=15,
    ).map(normalize)
)
def test_sum(f):
    assert abs(sum(f) - 1) < 0.0000001

例如您自己规范化结果列表,以便它通过条件。 请注意,这可能不会给您提供正好为 1 的数字(由于 float 字精度)。此外,假设可能会选择一些边缘情况(例如一些非常小的数字),这些情况在映射后可能不是边缘情况 - 这对您来说可能是问题,也可能不是问题。

关于python - Pytest:根据假设生成总和为 1 的 float 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64029340/

相关文章:

python - 是否可以安全地监控生产 Linux 系统上的 Python 堆栈?

pytest - pytest生成报告后如何执行代码(使用pytest)?

python - ttest_1samp 给出的 P_value 错误

N/Mean/SD 的 R T 检验

r - 孔雀测试实现

python - BeautifulSoup 用户的 html5lib/lxml 示例?

python - 下载器中间件忽略对 scrapy 中某个 URL 的所有请求

python - 语音识别包(https ://pypi. org/project/SpeechRecognition/)可以离线工作吗?

python - 如何使用 pytest 在 Django 中测试重定向?