iFlyCode 单元测试生成系统分析
版本: 3.4.2-222 | 分析日期: 2026-05-11
1. 概述
iFlyCode 的单元测试生成系统是最复杂的功能模块之一,支持 Java 和 C++ 的自动化测试生成。系统结合 Velocity 模板引擎和 AI 模型,支持 7 种测试框架组合,提供从方法选择到文件生成、编译、执行的完整流程。
2. 核心服务类
2.1 UnitTestService (1047 strings)
路径: com/aicode/test/UnitTestService职责: 单元测试服务 — 最大的服务类
关键方法:
testCollectionGenerate(Project, List<MethodUnitTestData>, String)— 测试收集生成resolveFunctionCase()— 解析函数用例setMethodUnitTestDataList()— 设置方法单测数据列表setCollectScheme()— 设置收集方案
关键依赖:
UnitTestDto.DataDTO/FunctionDataDTO/ValueDTO— 多层嵌套 DTORequestCaseCodeDto— 请求用例代码 DTOUnitTestAgentDto.method— Agent 单测方法 DTOCommandEnum— WebSocket 命令枚举
关键字符串常量:
LOG_TEST_COLLECTION_GENERATE— 测试收集生成日志标识
功能:
- 收集方法签名、参数类型、返回类型
- 分析方法调用链和依赖关系
- 构建 AI 请求生成测试用例
- 支持模板生成和 AI 精准生成两种策略
2.2 CppTestService (215 strings)
路径: com/aicode/test/CppTestService职责: C++ 测试服务
关键方法:
resolveFunctionCase()— 解析 C++ 函数用例cppTestAnalysis()— C++ 测试分析
关键字符串常量:
TEST_MAKE_CASE— 测试用例制作命令PYTHON_LANGUAGE_01— Python 语言标识(C++ 服务也引用 Python 配置)isModifyTestFrame— 是否修改测试框架pyTestFramework/pyMockFramework/pyModifyTestFrame— Python 测试配置
关键发现: C++ 测试服务引用 Python 测试配置,说明 C++ 测试可能复用 Python 的 pytest 框架。
2.3 BatchUnitTestService (163 strings)
路径: com/aicode/test/BatchUnitTestService实现: @Service IntelliJ 服务 职责: 批量单元测试服务
关键方法:
batchUnitTestCreate()— 创建批量单测任务batchUnitTestDelete()— 删除批量单测任务batchUnitTestList()— 获取批量单测任务列表batchUnitTestDownload()— 下载批量单测结果batchUnitTestMessage()— 批量单测消息
CommandEnum 映射:
| 方法 | CommandEnum | WebViewDataTypeEnum |
|---|---|---|
| batchUnitTestCreate | CODE_BATCH_UNIT_TEST_CREATE | - |
| batchUnitTestDelete | CODE_BATCH_UNIT_TEST_DELETE | - |
| batchUnitTestList | - | BATCH_UNIT_TEST_GET_TASK_LIST |
| batchUnitTestMessage | - | BATCH_UNIT_TEST_MESSAGE |
2.4 UnitTestDialog (322 strings)
路径: com/aicode/test/UnitTestDialog父类: DialogWrapper — IntelliJ 对话框基类 职责: 单元测试配置对话框
UI 组件:
JBCheckBox— 复选框(测试私有方法等)JRadioButton— 单选按钮(测试框架选择)ComboBox— 下拉框(Mock 框架选择)JLabel— 标签ExcludeMethodConfigurable— 排除方法配置
配置项:
- 测试框架选择 (JUnit4/JUnit5)
- Mock 框架选择 (Mockito/PowerMock/Disabled)
- 模板生成开关 (
GenaratebyTemplateSwitchEnum) - 是否测试私有方法
- 排除方法列表
3. 测试生成流程
1. 用户选择方法/类 → 右键 → 单元测试
└── UnitTestAction.actionPerformed()
└── UnitTestDialog.show()
├── 选择测试框架 (JUnit4/5)
├── 选择 Mock 框架 (Mockito/PowerMock)
└── 确认生成
2. 收集方法信息
└── UnitTestService.testCollectionGenerate()
├── 收集方法签名、参数类型、返回类型
├── TestSubjectInspector 分析调用链
└── MockBuilder 生成 Mock 配置
3a. 模板生成 (快速模式)
└── VelocityInitializer.render(template, context)
├── 选择模板 (JUnit5&Mockito.java.ft 等)
├── 填充上下文变量 ($replacementTypes, $mockBuilder)
└── 生成测试代码
3b. AI 精准生成 (精准模式)
└── CommonService.sendWsMessage(TEST_MAKE_CASE, data)
├── 发送方法信息到 Agent
├── Agent 调用 AI 模型分析代码分支
└── 返回精准测试用例
4. 写入测试文件
└── CreateTestFileTask.run()
├── 定位目标目录 (TargetDirectoryLocator)
├── 写入测试代码
└── 可选:编译 + 执行 + 收集覆盖率4. 批量单测流程
1. 用户选择多个文件/方法 → 批量单测
└── BatchUTGeneratorAction.actionPerformed()
└── BatchUnitTestDialog.show()
2. 创建批量任务
└── BatchUnitTestService.batchUnitTestCreate()
└── WebSocket: CODE_BATCH_UNIT_TEST_CREATE
3. 查询任务状态
└── BatchUnitTestService.batchUnitTestList()
└── WebSocket: BATCH_UNIT_TEST_GET_TASK_LIST
4. 下载结果
└── BatchUnitTestService.batchUnitTestDownload()
5. 删除任务
└── BatchUnitTestService.batchUnitTestDelete()
└── WebSocket: CODE_BATCH_UNIT_TEST_DELETE5. DTO 数据结构
5.1 UnitTestDto (多层嵌套)
UnitTestDto
└── DataDTO
└── FunctionDataDTO
├── Data — 方法数据
│ ├── path — 文件路径
│ ├── language — 编程语言
│ └── text — 源代码文本
├── CodeList — 代码列表
└── RangeDTO — 代码范围5.2 UnitTestAgentDto
UnitTestAgentDto
└── method — 方法信息
├── 方法签名
├── 参数列表
└── 返回类型5.3 RequestCaseCodeDto
RequestCaseCodeDto
└── ValueDTO — 用例代码值
├── 代码文本
└── 测试框架信息6. 关键发现
双生成策略: "快速生成"使用纯 Velocity 模板,"精准生成"结合 AI 模型识别代码分支后生成更精准的测试用例。
7 种框架组合: JUnit4, JUnit4&Mockito, JUnit4&Powermock, JUnit5, JUnit5&Mockito, SpringBootTest&Mockito, TestNG&Mockito。
C++ 测试复用 Python:
CppTestService引用pyTestFramework/pyMockFramework,说明 C++ 测试可能使用 pytest 框架。批量单测是异步任务: 通过 WebSocket 命令创建/查询/删除批量任务,Agent 端异步执行。
UnitTestService 是最大服务类: 1047 个字符串常量,624 个有意义的字符串,说明单测生成逻辑极其复杂。
模板生成开关:
GenaratebyTemplateSwitchEnum控制是否使用模板生成,用户可在对话框中切换。排除方法配置:
ExcludeMethodConfigurable允许用户排除不需要测试的方法(如 getter/setter)。企业框架支持: Velocity 模板中包含
com.bocom.jump.bp.core.*(交通银行) 的类型默认值,说明针对金融企业客户做了定制。