【问题标题】:python testing using hypothesis使用假设的python测试
【发布时间】:2017-10-25 06:10:50
【问题描述】:

如果想要针对已知类型的输入参数进行测试,包假设提供了一组丰富的策略供使用。

考虑以下类及其使用假设的测试之一:

from hypothesis.strategies import floats, integers, one_of
from hypothesis import given
import unittest

class A:
    def __init__(self, value=0):
        assert isinstance(value, (int, float))
        self.value = value

    @property
    def doubled(self):
        return self.value * 2


class Test_A(unittest.TestCase):

    @given(testval=one_of(floats(allow_infinity=False, allow_nan=False), integers()))
    def test_A_instantiation(self, testval):
        self.assertEqual(testval * 2, A(value=testval).doubled)


if __name__ == '__main__':
    unittest.main()

这会检查两件事:隐式地,如果提供的值是可接受的类型,并且显式地,self.double 中的计算是否正确。

这个测试类可以被认为是不完整的,至少因为除了 float 或 int 之外的任何输入类型都没有被检查:为此需要另一个测试用例,直接检查断言错误,比方说使用 AssertRaises。

我的问题是:您如何在假设检验哲学中做到这一点?

Hypothesis 似乎没有“not_one_of”策略,也就是说,您可以定义类似“除了 this-and-that 类型之外的所有内置类型”之类的东西。这只留下了定义“one_of”策略的可能性,其中包含一长串可供选择的类型。

注意:这整个情况让我想起了侏罗纪公园的根本问题,当他们检查是否有预期数量的恐龙时,却从未检查过是否有更多。所以我认为没有简单的解决方案,但我昨天首先尝试了假设,所以可能是我缺乏知识。

【问题讨论】:

  • 这样的测试永远不可能完成。我会考虑使用任何其他输入进行一次测试就足够了。特别是因为您正在测试 àssert isinstance`
  • 公平点:isinstance 基本上排除了所有其他类型并涵盖所有情况......如果类型定义正确,也应该进行测试,对吗?但我想我明白了:这就像测试内置断言。那么我们可以说上面的测试用例或多或少是正确和足够的吗?
  • 我会添加一个测试,您可以在其中进行测试,例如使用字符串而不是 int 和 float,因此只有一个测试用例断言应该失败。
  • 这就是我在第一次遇到假设之前组织测试的方式。我想我只需要在心理上适应假设的可能性以及在哪里使用它们。您愿意写一个答案以被接受还是我应该这样做?

标签: python python-unittest python-hypothesis


【解决方案1】:

对上述案例的测试永远不会完成,尤其是因为主要是关于测试断言。因此,如上所述,断言应该失败的单个测试就足够了。

【讨论】:

    【解决方案2】:

    另一种方法是使用filter method provided by hypothesis。然后您可以生成Any 对象并过滤掉那些您不想要的情况。由于您只会过滤一小部分,因此仍然可以执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 2022-06-27
      • 1970-01-01
      • 2017-03-17
      • 2020-03-03
      • 1970-01-01
      相关资源
      最近更新 更多