单元测试生成器:随机测试要和题目约束绑在一起
一、随机不是乱造
AI 可以帮算法题生成单元测试,但随机测试如果不理解题目约束,很容易造出非法用例,或者永远测不到关键边界。比如数组长度、元素范围、是否有重复、图是否连通、字符串字符集,这些都是测试生成的前提。
随机测试要和题目约束绑定,不是随便 random()。
二、先抽取约束
flowchart TD
A[题目描述] --> B[输入范围]
B --> C[结构约束]
C --> D[边界用例]
D --> E[随机生成器]
E --> F[暴力解对拍]
生成器需要知道合法输入是什么。图题要知道是不是无向图,树题要保证无环连通,区间题要保证 left <= right。
test_constraints:
n:
min: 1
max: 100000
values:
min: -1000
max: 1000
allow_duplicate: true
这些约束最好结构化保存。
三、小规模用暴力解对拍
def generate_case(n=8):
import random
return [random.randint(-10, 10) for _ in range(n)]
def check(solution, brute, rounds=1000):
for _ in range(rounds):
case = generate_case()
assert solution(case) == brute(case)
大规模测试看性能,小规模随机对拍看正确性。暴力解慢一点没关系,因为 n 可以很小。
AI 生成测试时,最好同时生成“为什么这个用例重要”。比如全负数、重复元素、空窗口、最大边界、不可达节点。这样测试集更容易被人审查。
四、边界用例要固定保存
随机测试每次不一样,发现问题后要把失败用例固定下来,加入回归集。否则今天发现的 bug,明天可能因为随机种子变化就测不到了。
regression_case:
source: random_fuzz
seed: 20260705
reason: duplicate_boundary_failed
保存 seed 也很重要。复杂生成器里,只有输入还不够,seed 能帮助复现整个生成过程。
还要区分非法输入测试。刷题平台通常只给合法输入,但工程系统里的函数可能要处理非法参数。题解测试和工程测试的目标不同,不要混在一起。
最后,测试生成器本身也要评测。它是否覆盖边界,是否生成非法用例,是否能稳定复现失败,这些都应该有指标。
生成器还要区分均匀随机和定向随机。均匀随机很容易测不到稀有边界,比如全相等、严格递增、只有一个负数、图中存在孤立点。定向随机可以专门提高这些模式出现概率。
random_case_strategy:
uniform_random: 50
boundary_pattern: 30
adversarial_pattern: 20
对抗用例尤其适合暴露错误复杂度。比如单调栈题给严格递增或递减数组,哈希题给大量重复元素,图题给稠密边。测试不是为了温柔,而是为了尽早把错误逼出来。
最后,AI 生成测试时要避免只生成“看起来复杂”的用例。复杂不等于有效,能击中错误假设的用例才有价值。
五、总结
单元测试生成器要先结构化题目约束,再结合边界用例、随机对拍、暴力解和回归保存。
随机测试不是乱造。和题目约束绑在一起,随机才会变成真正的质量工具。
810

被折叠的 条评论
为什么被折叠?



