0

一般来说,我是 Python 的假设库和基于属性的测试的新手。我想使用以下语法生成任意嵌套的策略表达式:

((A和B)或C)

我觉得递归策略是我想要的,但我很难理解如何使用它。我拥有的代码似乎只生成一个“级别”的表达。这是我所拥有的:

import unittest

from hypothesis import given
from hypothesis.strategies import text, composite, sampled_from, characters, recursive, one_of


def policy_expressions():
    return recursive(attributes(), lambda base_strategy: one_of(base_strategy, policy_expression()))

@composite
def policy_expression(draw):
    left = draw(attributes())
    right = draw(attributes())
    gate = draw(gates())
    return u' '.join((left, gate, right))


def attributes():
    return text(min_size=1, alphabet=characters(whitelist_categories='L', max_codepoint=0x7e))


def gates():
    return sampled_from((u'or', u'and'))


class TestPolicyExpressionSpec(unittest.TestCase):

    @given(policy_expression=policy_expressions())
    def test_policy_expression_spec(self, policy_expression):
        print policy_expression
        assert policy_expression # not empty

如何使用 Hypothesis 生成任意嵌套的策略表达式?

4

2 回答 2

2

我认为这可能会做你想要的。

import unittest

from hypothesis import given
from hypothesis.strategies import text, composite, sampled_from, characters, recursive, one_of


def policy_expressions():
    return one_of(attributes(), policy_expression())

@composite
def policy_expression(draw):
    left = draw(policy_expressions())
    right = draw(policy_expressions())
    gate = draw(gates())
    return u' '.join((left, gate, right))


def attributes():
    return text(min_size=1, alphabet=characters(whitelist_categories='L', max_codepoint=0x7e))


def gates():
    return sampled_from((u'or', u'and'))


class TestPolicyExpressionSpec(unittest.TestCase):

    @given(policy_expression=policy_expressions())
    def test_policy_expression_spec(self, policy_expression):
        print policy_expression
        assert policy_expression # not empty

if __name__ == '__main__':
    unittest.main()
于 2018-09-07T10:02:13.030 回答
2

我相信正确的方法是这样,base_strategy作为一个论点policy_expression

def policy_expressions():
    return recursive(attributes(), policy_expression)

@composite
def policy_expression(draw, base_strategy):
    left = draw(base_strategy)
    right = draw(base_strategy)
    gate = draw(gates())
    return u' '.join((left, gate, right))

接受的未使用答案recursive可能会遇到假设博客中生成递归数据帖子中描述的问题。

于 2019-04-05T13:01:50.843 回答