章节 01
导读 / 主楼:AI Agent能否编写高质量的基于属性的测试?
该项目尝试复现论文《Can Large Language Models Write Good Property-Based Tests?》的实验,在现代Agent上下文中使用相同提示词,通过Hypothesis库和Codex比较AI生成的属性测试与人类编写的测试。研究探索了AI在软件测试自动化领域的潜力和局限。
正文
该项目尝试复现论文《Can Large Language Models Write Good Property-Based Tests?》的实验,在现代Agent上下文中使用相同提示词,通过Hypothesis库和Codex比较AI生成的属性测试与人类编写的测试。研究探索了AI在软件测试自动化领域的潜力和局限。
章节 01
该项目尝试复现论文《Can Large Language Models Write Good Property-Based Tests?》的实验,在现代Agent上下文中使用相同提示词,通过Hypothesis库和Codex比较AI生成的属性测试与人类编写的测试。研究探索了AI在软件测试自动化领域的潜力和局限。
章节 02
章节 03
软件测试是保证代码质量的核心环节。传统测试方法主要依赖“基于示例的测试”(Example-Based Testing),即开发者编写具体的输入-输出对来验证代码正确性。例如:
def test_add():
assert add(2, 3) == 5
assert add(-1, 1) == 0
这种方法直观易懂,但存在明显局限:
基于属性的测试(Property-Based Testing, PBT)提供了不同的思路。它不指定具体输入,而是定义“属性”——代码应该满足的不变式。测试框架自动生成大量随机输入来验证这些属性。
@given(st.integers(), st.integers())
def test_add_commutative(a, b):
assert add(a, b) == add(b, a)
Python的Hypothesis库是PBT的代表实现,它通过智能的输入生成和缩减策略,能够发现人工难以想到的边界情况。
章节 04
2023年发表的论文《Can Large Language Models Write Good Property-Based Tests?》首次系统性地研究了LLM生成PBT的能力。研究发现:
随着AI Agent技术的进步,测试生成任务是否有了新的可能性?Agent不仅能生成代码,还能迭代改进、执行测试、分析结果——形成一个闭环。
章节 05
本项目尝试在“现代Agent上下文”中复现原论文的实验,核心研究问题是:
AI Agent能否比单次LLM调用生成更高质量的PBT?
章节 06
项目采用对照实验方法:
实验组:Agent驱动生成
使用Codex等Agent系统,在迭代循环中生成测试:
对照组:单次提示生成
使用与原论文相同的提示词,单次调用LLM生成测试,不做迭代优化。
基准组:人工编写
开发者基于经验手动编写Hypothesis测试,作为质量基准。
章节 07
项目从多个维度评估测试质量:
覆盖率:生成的测试能达到多少代码覆盖率
缺陷发现能力:能否发现已知的或注入的缺陷
属性意义:生成的属性是否真正反映了代码的预期行为,而非无意义的恒真式
代码可读性:生成的测试代码是否易于理解和维护
生成效率:达到同等质量需要多少轮迭代
章节 08
项目深度使用Hypothesis库,包括:
策略(Strategies)定义
策略定义了如何生成测试输入。项目比较AI生成的策略与人类编写的策略:
# 人类可能编写的策略
positive_integers = st.integers(min_value=1)
# AI可能生成的策略
ai_generated_strategy = st.one_of(
st.integers(),
st.floats(allow_nan=False)
)
不变式(Invariants)表达
不变式是PBT的核心。项目评估AI能否生成有意义的不变式:
# 良好的不变式:反映业务逻辑
def test_roundtrip_encoding(data):
assert decode(encode(data)) == data
# 无意义的不变式:恒真
def test_identity(x):
assert x == x
状态机测试
对于复杂系统,Hypothesis支持状态机测试。项目探索AI能否生成有效的状态转换模型。