pytest:生成带有假设的总计为1的浮点列表

问题描述

对于单元测试,我想使用list库生成float的{​​{1}}。有一些重要的约束条件:

  1. 列表中的成分数必须大于1并且小于15
  2. 最小值必须大于0
  3. 最大值必须小于1
  4. 所有成分的总和必须完全等于一(1)

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

hypothesis

我如何满足第四个约束条件?

解决方法

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

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的数字(由于浮点数精度)。此外,假设可能会选择一些边缘情况(例如一些非常小的数字),而映射后可能不是边缘情况-这可能对您来说不是问题。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...