【问题标题】:Should I instantiate Hypothesis strategies that are used by multiple tests?我应该实例化多个测试使用的假设策略吗?
【发布时间】:2017-04-24 19:10:14
【问题描述】:

内置假设策略是通过函数提供的(例如,integers 是创建策略的函数,而不是实际策略)。这表明策略对象具有内部状态。

@given(integers())
def test_foo(n):
    assert n > 0    
@given(integers())
def test_bar(n):
    assert n < 100

在上面的两个虚假测试中,每个测试都会获得一个不同的策略对象(来自 integers 的不同调用。如果我然后像这样创建自己的策略:

positive_integers = integers().filter(lambda x: x > 0)

...然后将其用于相同的测试:

@given(positive_integers)
def test_foo(n):
    assert n > 0    
@given(positive_integers)
def test_bar(n):
    assert n < 100

它们共享相同的策略对象。这在我看来可能是错误的,但在某些情况下,examples in the docs 就是这样做的(参见NodeStrategyNodeSet 的定义)。我是否应该通过将策略组合包装在如下函数中来避免这种情况:

 positive_integers = lambda: integers().filter(lambda x: x > 0)
 #...
 @given(positive_integers())

【问题讨论】:

    标签: python unit-testing hypothesis-test


    【解决方案1】:

    我查看了source code,看起来您应该可以跨测试共享相同的策略对象。似乎您调用了一个函数,因此您可以为策略传递不同的参数。

    我认为这意味着你可以这样做:

    @given(integers(min_value=0))
    def test_foo(n):
        assert n > 0    
    @given(integers(min_value=0))
    def test_bar(n):
        assert n < 100
    

    或者这个:

    positive_integers = integers(min_value=0)
    
    @given(positive_integers)
    def test_foo(n):
        assert n > 0    
    @given(positive_integers)
    def test_bar(n):
        assert n < 100
    

    我看不到任何超出范围边界的状态证据。其实BoundedIntStrategy好像是获取了作为参数传入的搜索数据:

    def do_draw(self, data):
        return d.integer_range(data, self.start, self.end)
    

    但是,我只玩了一点假设,所以我肯定是错的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多