如果要针对已知类型的输入参数进行测试,包假设提供了一套丰富的策略。
考虑以下类别及其使用假设的测试之一:
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。
我的问题是:在假设检验哲学中,你是如何做到这一点的?
假设似乎没有“not_one_of”策略,也就是说,可以定义“除了这个和那个类型之外的所有内置类型”。这只留下了定义“one_of”策略的可能性,其中有一长串类型可供选择。
注意:整个情况让我想起了侏罗纪公园的根本问题,当时他们检查了恐龙的数量是否达到了预期,但从未检查过恐龙的数量是否超过预期。所以我不认为没有简单的解决方案,但我昨天第一次尝试了假设,所以可能是我缺乏知识。