先看看示例
作者提供的示例,实际效果取决于你的输入和使用工具。
输入
Python函数normalize会trim并合并空格;要求对所有文本满足重复执行不变。
输出
编辑示例 · 未运行
from hypothesis import given, strategies as st
@given(st.text())
def test_normalize_is_idempotent(value):
once = normalize(value)
assert normalize(once) == once仍需独立例子验证输出语义,恒等函数也能满足幂等。
方法说明
为编解码、校验器等写性质和生成器,并分析收缩后的反例。
具体任务
验证输入域中的不变量:为编解码、归一化或排序写性质测试。
分析最小反例:判断失败来自真实缺陷还是错误的性质定义。
必需材料
待测函数及输入约束
应保持的不变量
可选材料
既有例子测试
项目使用的性质测试框架
使用门槛
问题具有可表达的性质,例如往返、幂等、守恒或排序关系。
这个 Skill 额外提供的方法
让工具寻找手写用例没想到的边界,并缩小成易解释的反例。
编辑示例(未运行)
规范化函数重复执行应保持不变
任务:为normalize函数写幂等性质测试
输入:
Python函数normalize会trim并合并空格;要求对所有文本满足重复执行不变。
结果片段:
```python
from hypothesis import given, strategies as st
@given(st.text())
def test_normalize_is_idempotent(value):
once = normalize(value)
assert normalize(once) == once
```
仍需独立例子验证输出语义,恒等函数也能满足幂等。
以下为官方编辑构造的示例,未运行上游 Skill。未运行代码,特意指出“满足幂等”不意味着功能完全正确。
首次任务
任务:验证输入域中的不变量。
任务重点:为编解码、归一化或排序写性质测试。
必需材料:
- 待测函数及输入约束:[填写或粘贴我的材料;未具备则说明]
- 应保持的不变量:[填写或粘贴我的材料;未具备则说明]
可选补充:
- 既有例子测试:[可填写,未提供不应假定存在]
- 项目使用的性质测试框架:[可填写,未提供不应假定存在]
请交付适配现有环境的代码或配置、必要说明及验证办法。仅依据这些材料处理;缺少决定结果的信息时先说明缺口,不补造事实。未执行的检查、修改或外部操作明确标为未执行。
使用前提:问题具有可表达的性质,例如往返、幂等、守恒或排序关系。
处理边界:错误性质会误报正确实现;生成器必须覆盖有效输入域,不能用过滤排除所有困难情况
验收要求:
1. 性质独立于实现且有业务含义。
2. 生成器覆盖边界而非过度过滤。
3. 失败反例可复现并人工解释。
验收方法
性质独立于实现且有业务含义
生成器覆盖边界而非过度过滤
失败反例可复现并人工解释
依赖与准备
对应语言框架,如Hypothesis、fast-check或proptest;不替代端到端UI或性能测试。
使用边界
错误性质会误报正确实现
生成器必须覆盖有效输入域,不能用过滤排除所有困难情况
排错
测试永远通过:检查是否循环调用同一实现当作oracle。
缩小反例看似无效:核对生成器约束和性质是否适用该输入。
固定来源
https://github.com/trailofbits/skills/blob/0cc1c73a5e96749ab32d7ea5e14892fafa6972ae/plugins/property-based-testing/skills/property-based-testing/SKILL.md