autotest-agent
AI 驱动的 Python 单元测试生成工具。输入源码,自动生成 pytest 测试,沙箱验证,失败自修复。
当前架构(2026-08)
CLI → Orchestrator.run(source)
├─ 文件级 (默认): 每个 .py 文件 → 一个 agent
└─ 组级 (AUTOTEST_GROUP=on): 项目函数 → 依赖图 → 社区检测分组 → 每组一个 agent
Agent 循环 (AUTOTEST_PIPELINE=fixed 时启用, 无 LLM 决策):
generate_test → run_test → fix_test(收敛刹车) → get_coverage → done
默认 ReAct (LangChain React agent): LLM 自主迭代, recursion_limit 上限
依赖分组 (A2):
DependencyGraph.build() 建跨文件边 → GroupBuilder 社区检测分组
→ DepGroup 拓扑排序合并源码 (被依赖方在前) → LLM 看完整因果链
组间并行 (B2):
asyncio.gather 并发跑每组
tools.py 模块全局 → ContextVar, 每组独立状态, 无串扰
核心能力
| 能力 | 实现 |
|---|---|
| AST 解析 | 函数签名、类方法、继承链、构造函数 |
| 依赖分组 | group_by_dependency() 社区检测 + 拓扑合并 |
| 组间并行 | asyncio.gather + ContextVar 隔离 |
| 收敛刹车 (fixed 管道) | check_convergence(3) 同类错误 3 次即停 |
| 沙箱验证 | 包树镜像 + 最小化环境 + SecurityScanner(别名/间接调用拦截)+ 网络屏蔽 |
| 语义拆分 | status: verified / generated / failed |
| 反幻觉 (fixed 管道) | API 参考表 + BANNED 扫描 + 生成后验证 |
质量评估(cerberus 46 组,历史数据)
| # | 维度 | 值 | 说明 |
|---|---|---|---|
| 1 | 通过率 | 85.2% | 2431/2854 测试通过 |
| 2 | 覆盖率 | 93.9% | 行覆盖高 |
| 3 | 突变杀死率 | 33.7% | 短板:行为覆盖不足 |
| 4 | API 幻觉 | 1 处 | 极低 |
| 5 | 黑盒率 | 92.9% | 走公共 API |
| 6 | 模块命中 | 100% | 每组测对目标 |
| 7 | 重复率 | 8.8% | 低 |
| 8 | 断言有效性 | 83.5% | 真值断言为主 |
| 9 | 覆盖盲区 | 1 | BareValidator misuse |
关键洞察:覆盖率 93.9%(行覆盖)与突变杀死率 33.7%(行为覆盖)的巨大差距,说明测试走到大多数代码行,但只验证了 1/3 的操作符行为。这是"断言深度不足"的量化证据——prompt 应更强调对每个操作符分支写具体断言,而非仅让测试跑通。
评估工具:evaluate_generated.py 9 维评估,支持通过率/覆盖率/突变/幻觉/黑盒/模块/重复/断言/盲区。
用法
# 安装
pip install -e .
# 配置 API key (推荐环境变量; 或写 autotest.yaml 的 llm.api_key)
export DEEPSEEK_API_KEY=sk-xxx
# 文件级生成
autotest generate ./src/ --coverage 80
# 组级生成 (依赖分组 + 并行)
AUTOTEST_GROUP=on autotest generate ./src/ --coverage 80
# 预览
autotest generate ./src/ --dry-run
对比
- 固定管道 vs ReAct: 固定管道快 8x (5轮封顶), ReAct 覆盖率略高 (LLM 自主迭代)。默认走 ReAct;固定管道用
AUTOTEST_PIPELINE=fixed - 组级 vs 文件级: 组级根治跨文件盲区 (LLM 看完整依赖链), 文件级简单。组级用
AUTOTEST_GROUP=on
项目结构
src/autotest/
├── cli/ # CLI 入口 (generate / config)
├── analyzer/ # AST 解析、依赖图、分组、introspector
├── agent/ # ReAct agent、固定管道引擎、工具、ContextVar 状态、沙箱
├── llm/ # LangChain/DeepSeek Provider、PromptTemplate、middleware
├── config.py # 配置模型 (llm/agent/execution/output)
└── orchestrator.py # 文件级 + 组级调度
test_projects_real/ # cerberus 真实项目 (验证用)
generated_tests/ # 生成测试输出
run_cerberus.py # cerberus 全量生成脚本
evaluate_generated.py # 9 维质量评估
_deprecated/ # 历史死代码归档 (含 checkpoint/rate_limiter/edge_detector/mock_constructor 等)
注:早期设计模块(edge_detector、mock_constructor、metrics、output、verify、sdk、trace、plugins、rate_limiter)已归档到
_deprecated/,未参与主流程。
License
MIT
Metadata
Release files for autotest-agent 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| autotest_agent-0.2.0.tar.gz | 36.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| autotest_agent-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 78.8 kB
Release files / autotest_agent-0.2.0.tar.gz
| Download URL | autotest_agent-0.2.0.tar.gz |
|---|---|
| Size | 36.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8c8cbee19cfbf0cd119bfd4ea1ec9ae73e1b77fa2f4409e79d4bd2f0fc8db6c0
|
|
BLAKE2b-256 checksum How to use checksums |
f1bf0b1824b417dd87d4cca9e3e400d7e6dfceae5f29fc2277260486fbab0de9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.9
|
Release files / autotest_agent-0.2.0-py3-none-any.whl
| Download URL | autotest_agent-0.2.0-py3-none-any.whl |
|---|---|
| Size | 42.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
26f8be44472abdfafc8f0392a96d45fd1753dd24203d8495a73c900f90dbdd29
|
|
BLAKE2b-256 checksum How to use checksums |
e96e9f5b070f4fddedf459759fd443e7c8c74bc20943fb94b11f9e67e60add1f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.9
|