AI 可以提出模糊测试的输入维度,但随机生成不能只跑一次就丢掉。固定种子、保存输入和明确不变量,失败后才能把同一问题交回AI修正。
希望AI辅助检查解析函数边界的开发者。本文使用 Python 3.11 或以上版本的标准库,先验证一组人工构造的小样本。AI 负责提出实现或解释差异,结果由本地检查决定;这里没有把模型回答当成真实运行结果。

生成可复现的解析器模糊样本前,先定规则
本例解析器只接受1到3位ASCII数字。随机输入包括字母、全角数字、负号和空格,成功时应符合格式且数值在0到999。
失败不是程序异常逃逸;它应是预期的ValueError。其它异常必须保存输入并判为测试失败。
固定seed只是可复现条件之一,还需保存Python版本与失败原文。算法实现或运行环境变化可能改变序列。
给 AI 的输入要包含什么
把下面这份输入说明和你的实际样本一起交给可用的 AI 编程助手。示例只含虚构数据;对真实材料先去除账号凭据和个人信息。
为parse_count做seed=7的字符级模糊测试:长度0到5,字符包含ASCII数字、字母、空格、全角数字和负号;成功则格式与范围成立,拒绝只允许ValueError。保存发现的原输入,不把全部拒绝视作失败。
要求模型保留检查条件,并把它认为缺少的业务定义列出来。若回答改变了输入字段、忽略异常分支或直接删除原材料,先要求修正,再运行。提示词的作用是缩小任务范围,验收仍以代码和数据为准。
保存并运行最小验证程序
下方程序把关键规则和验证用例放在同一个可复跑示例中,便于先理解输入如何变成输出,再用它检查 AI 给出的实现。
新建一个空目录,把下面代码保存为 check.py,在该目录打开终端,运行 python -X utf8 check.py。代码自带示例输入,不需要安装第三方库。
import random,re
def parse_count(s):
if re.fullmatch('[0-9]{1,3}',s) is None: raise ValueError('format')
return int(s)
rng=random.Random(7)
samples=[''.join(rng.choice('01239a -1') for _ in range(rng.randrange(6))) for _ in range(120)]
def check_samples(parser,values):
accepted=0; rejected=0; failures=[]
for s in values:
expected=re.fullmatch('[0-9]{1,3}',s) is not None
try:
n=parser(s)
if not expected or type(n) is not int or not 0<=n<=999:
raise AssertionError('accepted input violates contract')
accepted+=1
except ValueError as error:
if expected:
failures.append({'input':s,'exception':type(error).__name__,'reason':str(error)})
else: rejected+=1
except Exception as error:
failures.append({'input':s,'exception':type(error).__name__,'reason':str(error)})
return accepted,rejected,failures
accepted,rejected,failures=check_samples(parse_count,samples)
assert accepted+rejected==120 and failures==[]
assert accepted>0 and rejected>0
print('samples',120,'accepted',accepted,'rejected',rejected)
print('seed',7)
# A deliberately wrong implementation demonstrates the failure ledger.
def broken_parser(s): raise RuntimeError('fictional parser bug')
_,_,failed=check_samples(broken_parser,['1'])
from pathlib import Path
from tempfile import TemporaryDirectory
import json
with TemporaryDirectory() as tmp:
path=Path(tmp)/'failure_samples.json'
path.write_text(json.dumps({'seed':7,'failures':failed},ensure_ascii=False),encoding='utf8')
saved=json.loads(path.read_text(encoding='utf8'))
assert saved['failures'][0]['input']=='1'
assert saved['failures'][0]['exception']=='RuntimeError'
print('saved_failure_sample',saved['failures'][0])
怎样判断结果符合要求
样本数为120,accepted加rejected等于120且两类都有出现。分类计数来自本次固定环境运行,不是软件可靠性评分。故意错误的解析器把输入1和RuntimeError写入临时failure_samples.json并读回;真实批次应在受控目录保留这份账本,演示临时目录会自动清理。
下方是这份最小示例在本地执行得到的输出。它验证示例程序与断言的关系,不代表任何 AI 模型一次就能生成同样代码,也不构成性能或生产可靠性结论。
samples 120 accepted 20 rejected 100
seed 7
saved_failure_sample {'input': '1', 'exception': 'RuntimeError', 'reason': 'fictional parser bug'}
如果把int调用放在宽松try中,意外异常可能被当预期拒绝掩盖。捕获异常类型应和契约一致。
随机样本补充人工边界,不能替代确定的最小/最大长度用例。
哪些失败必须停下来处理
随机输入没有覆盖所有Unicode、超长输入或资源消耗;需要根据解析器真实入口扩展维度。
若发现失败但只记录seed,无法在算法变化后可靠重放;保存具体输入与异常更重要。
接入自己的任务前再核对一次
把失败输入缩减成最小复现,再让AI解释违反的不变量。
修复后保留失败输入为固定回归样本,同时继续运行原seed批次。
资料与适用范围
random.Random可创建独立伪随机生成器;固定种子帮助在指定环境重现序列。以下链接核对于 2026-10-03;运行环境及额外依赖按本文前述说明。
相关基础可阅读 Cursor 怎么帮代码补测试?先锁定边界用例,再运行回归命令。本文的重点是生成可复现的解析器模糊样本,可以把两项检查作为不同步骤保留。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/33382.html