关于 property-based-testing
property-based-testing 是一种通过自动生成大量输入来验证代码通用属性与不变量的测试技能。适合查找边界情况,并补充基于示例的测试。
主要功能
- 01自动生成测试输入
- 02验证通用属性与不变量
- 03发现边界情况
- 04检查往返编码与解码
- 05收缩失败用例
适用场景
- 01验证算法的数学属性
- 02测试解析器和序列化器
- 03检查数据转换与数据结构操作
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ aj-geddes/ useful-ai-prompts --skill property-based-testing安装后在 Claude Code 中输入/property-based-testing确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/fast-check-for-javascripttypescript.mdhypothesis-for-python.mdjunit-quickcheck-for-java.mdscripts/scaffold-tests.shtemplates/test-template.js详细介绍
基于属性的测试
目录
概述
基于属性的测试会针对大量自动生成的输入,验证代码是否满足一般性属性或不变量,而不是测试特定示例。这种方法能够发现基于示例的测试经常遗漏的边界情况和错误。
适用场景
- 测试具有数学性质的算法
- 验证始终应成立的不变量
- 自动查找边界情况
- 测试解析器和序列化器(往返属性)
- 验证数据转换
- 测试排序、搜索和数据结构操作
- 发现意料之外的输入组合
快速开始
最小可用示例:
# test_string_operations.py
import pytest
from hypothesis import given, strategies as st, assume, example
def reverse_string(s: str) -> str:
"""Reverse a string."""
return s[::-1]
class TestStringOperations:
@given(st.text())
def test_reverse_twice_returns_original(self, s):
"""Property: Reversing twice returns the original string."""
assert reverse_string(reverse_string(s)) == s
@given(st.text())
def test_reverse_length_unchanged(self, s):
"""Property: Reverse doesn't change length."""
assert len(reverse_string(s)) == len(s)
@given(st.text(min_size=1))
def test_reverse_first_becomes_last(self, s):
"""Property: First char becomes last after reverse."""
reversed_s = reverse_string(s)
assert s[0] == reversed_s[-1]
assert s[-1] == reversed_s[0]
// ... (see reference guides for full implementation)
参考指南
references/ 目录中的详细实现:
| 指南 | 内容 |
|---|---|
| Hypothesis for Python | Python 的 Hypothesis |
| fast-check for JavaScript/TypeScript | JavaScript/TypeScript 的 fast-check |
| junit-quickcheck for Java | Java 的 junit-quickcheck |
最佳实践
✅ 应该做
- 关注一般性属性,而非特定情况
- 测试数学性质(交换律、结合律)
- 验证往返编码和解码
- 使用收缩功能找到最小失败案例
- 与基于示例的测试结合,以覆盖已知边界情况
- 测试始终应成立的不变量
- 生成符合实际的输入分布
❌ 不应该做
- 测试恒真命题
- 对输入生成施加过多限制
- 忽略收缩后的测试失败
- 用属性测试替代所有示例测试
- 测试实现细节
- 不加约束地生成无效输入
- 忘记处理生成器中的边界情况
评论
支持 Markdown