python 使用假设进行检验
python testing using hypothesis
如果想要针对已知类型的输入参数进行测试,包假设提供了一组丰富的策略供使用。
考虑以下 class 及其使用假设的检验之一:
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 中的计算是否正确。
这个测试 class 至少可以被认为是不完整的,因为没有检查 float 或 int 以外的任何输入类型:为此需要另一个测试用例,直接检查断言错误,比方说使用 AssertRaises.
我的问题是:你是如何在假设检验哲学中做到这一点的?
假设似乎没有 "not_one_of" 策略,也就是说,您可以在其中定义类似 "all builtin types except for this-and-that types" 的策略。这只剩下定义一个 "one_of" 策略的可能性,该策略包含一长串可供选择的反弹类型。
注意:整个情况让我想起了侏罗纪公园的根本问题,当时他们检查了是否有预期数量的恐龙,但从未检查过是否有更多。所以我认为没有简单的解决方案,但我昨天第一次尝试假设所以可能是我缺乏知识。
上述案例的测试永远无法完成,尤其是因为要点是关于测试断言。因此,如上所述,断言应该失败的单个测试就足够了。
另一种方法是使用 filter method provided by hypothesis。然后你可以生成 Any
对象并过滤掉那些你不想要的情况。由于您只会过滤一小部分,因此这仍然是高性能的。
如果想要针对已知类型的输入参数进行测试,包假设提供了一组丰富的策略供使用。
考虑以下 class 及其使用假设的检验之一:
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 中的计算是否正确。
这个测试 class 至少可以被认为是不完整的,因为没有检查 float 或 int 以外的任何输入类型:为此需要另一个测试用例,直接检查断言错误,比方说使用 AssertRaises.
我的问题是:你是如何在假设检验哲学中做到这一点的?
假设似乎没有 "not_one_of" 策略,也就是说,您可以在其中定义类似 "all builtin types except for this-and-that types" 的策略。这只剩下定义一个 "one_of" 策略的可能性,该策略包含一长串可供选择的反弹类型。
注意:整个情况让我想起了侏罗纪公园的根本问题,当时他们检查了是否有预期数量的恐龙,但从未检查过是否有更多。所以我认为没有简单的解决方案,但我昨天第一次尝试假设所以可能是我缺乏知识。
上述案例的测试永远无法完成,尤其是因为要点是关于测试断言。因此,如上所述,断言应该失败的单个测试就足够了。
另一种方法是使用 filter method provided by hypothesis。然后你可以生成 Any
对象并过滤掉那些你不想要的情况。由于您只会过滤一小部分,因此这仍然是高性能的。