跳到主要内容
哒哒星球DADA PLANET

Skill · 已公开版本

property-based-testing · 让测试覆盖一整个输入范围

为编解码、校验器等写性质和生成器,并分析收缩后的反例。

先看看示例

作者提供的示例,实际效果取决于你的输入和使用工具。

输入

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