【问题标题】:Pytest: generating list of floats summing up to 1 with hypothesisPytest:使用假设生成总和为 1 的浮点数列表
【发布时间】:2021-01-09 17:40:42
【问题描述】:

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

  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,
    )
)

我怎样才能满足第四个约束?

【问题讨论】:

    标签: python pytest hypothesis-test


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-03-07
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 2020-12-28
      • 2020-02-13
      • 2018-07-14
      • 1970-01-01
      相关资源
      最近更新 更多