如何为Python Hypothesis的RuleBasedStateMachine添加@example用例
为RuleBasedStateMachine使用@example复现测试失败场景
在Hypothesis中为RuleBasedStateMachine添加@example装饰器,核心是直接传入触发失败的事件序列,让状态机按指定步骤执行,从而复现问题场景。以下是具体实现方式:
步骤1:定义状态机
先实现一个包含异常场景的状态机示例(以栈操作为例,空栈执行pop会抛出错误):
from hypothesis import given, example from hypothesis.stateful import RuleBasedStateMachine, rule class StackMachine(RuleBasedStateMachine): def __init__(self): self.stack = [] @rule(value=int()) def push(self, value): self.stack.append(value) @rule() def pop(self): if not self.stack: raise ValueError("Cannot pop from empty stack") self.stack.pop()
步骤2:用@example传入失败触发序列
通过StackMachine.events()定义事件序列生成器,再用@example传入特定的事件列表,指定状态机的执行步骤:
@given(StackMachine.events()) @example([StackMachine.pop()]) # 直接执行pop,触发空栈错误 @example([StackMachine.push(5), StackMachine.pop(), StackMachine.pop()]) # 二次pop触发错误 def test_stack_machine(events): StackMachine().run(events)
关键说明
- 事件序列格式:
@example的参数是状态机rule方法的实例列表,每个实例对应一次操作 - 带参数的rule:如果rule需要参数,直接在事件实例中传入,比如
StackMachine.push(5) - 复用状态机测试:也可以先通过
as_test()将状态机转为测试函数,再添加@example:TestStackMachine = StackMachine.as_test() @example([StackMachine.pop()]) def test_stack(): TestStackMachine()
内容的提问来源于stack exchange,提问作者Zhou Cheng
相关产品推荐
相关产品推荐

