代码之家  ›  专栏  ›  技术社区  ›  jake77

使用假设的python测试

  •  2
  • jake77  · 技术社区  · 7 年前

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

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

    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”策略的可能性,其中有一长串类型可供选择。

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   Sosel    7 年前

    测试上述情况永远不可能完成,尤其是因为主要的问题是测试断言。因此,如上所述,断言失败的单个测试就足够了。

        2
  •  0
  •   Ivo Merchiers kakajan    6 年前

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