使用假设进行python测试

时间:2017-10-25 06:10:51

标签: python python-unittest python-hypothesis

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

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

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

我的问题是:你如何在假设测试哲学上做到这一点?

假设似乎没有a" not_one_of"策略,也就是说,你可以定义类似于"所有内置类型的东西,除了这个和那个类型"。这样就只能定义一个" one_of"策略有一长串类型可供选择。

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

2 个答案:

答案 0 :(得分:1)

以上情况的测试永远不会完成,特别是因为要点是测试断言。因此,如上所述,断言应该失败的单个测试就足够了。

答案 1 :(得分:0)

一种替代方法是使用filter method provided by hypothesis。然后,您可以生成Any对象,并过滤掉不需要的情况。由于您只会过滤一小部分,因此效果仍然不错。