Skip to content

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 — 多层嵌套 DTO
  • RequestCaseCodeDto — 请求用例代码 DTO
  • UnitTestAgentDto.method — Agent 单测方法 DTO
  • CommandEnum — 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 映射:

方法CommandEnumWebViewDataTypeEnum
batchUnitTestCreateCODE_BATCH_UNIT_TEST_CREATE-
batchUnitTestDeleteCODE_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_DELETE

5. DTO 数据结构

5.1 UnitTestDto (多层嵌套)

UnitTestDto
  └── DataDTO
        └── FunctionDataDTO
              ├── Data — 方法数据
              │     ├── path — 文件路径
              │     ├── language — 编程语言
              │     └── text — 源代码文本
              ├── CodeList — 代码列表
              └── RangeDTO — 代码范围

5.2 UnitTestAgentDto

UnitTestAgentDto
  └── method — 方法信息
        ├── 方法签名
        ├── 参数列表
        └── 返回类型

5.3 RequestCaseCodeDto

RequestCaseCodeDto
  └── ValueDTO — 用例代码值
        ├── 代码文本
        └── 测试框架信息

6. 关键发现

  1. 双生成策略: "快速生成"使用纯 Velocity 模板,"精准生成"结合 AI 模型识别代码分支后生成更精准的测试用例。

  2. 7 种框架组合: JUnit4, JUnit4&Mockito, JUnit4&Powermock, JUnit5, JUnit5&Mockito, SpringBootTest&Mockito, TestNG&Mockito。

  3. C++ 测试复用 Python: CppTestService 引用 pyTestFramework/pyMockFramework,说明 C++ 测试可能使用 pytest 框架。

  4. 批量单测是异步任务: 通过 WebSocket 命令创建/查询/删除批量任务,Agent 端异步执行。

  5. UnitTestService 是最大服务类: 1047 个字符串常量,624 个有意义的字符串,说明单测生成逻辑极其复杂。

  6. 模板生成开关: GenaratebyTemplateSwitchEnum 控制是否使用模板生成,用户可在对话框中切换。

  7. 排除方法配置: ExcludeMethodConfigurable 允许用户排除不需要测试的方法(如 getter/setter)。

  8. 企业框架支持: Velocity 模板中包含 com.bocom.jump.bp.core.* (交通银行) 的类型默认值,说明针对金融企业客户做了定制。

本项目仅供学习研究,逆向分析内容归原厂商所有。