Skip to content

Commit 7701af1

Browse files
committed
add mono repo support
1 parent e648737 commit 7701af1

File tree

3 files changed

+346
-53
lines changed

3 files changed

+346
-53
lines changed

CHANGELOG.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,31 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1616
- Supports both JUnit 4 and JUnit 5 annotations
1717
- Lifecycle method source code is included in JSON output with field names: `beforeMethods`, `beforeAllMethods`, `afterMethods`, `afterAllMethods`
1818

19+
- **🏗️ Mono Repository (Mono Repo) Support**: Major enhancement for multi-module projects
20+
- **Recursive Test Discovery**: Automatically finds all test directories across the entire project tree
21+
- **Multi-Module Detection**: Supports Maven and Gradle multi-module project structures
22+
- **Smart Filtering**: Intelligently skips build output directories (`/build/`, `/target/`, `/bin/`, `/out/`)
23+
- **Nested Directory Handling**: Removes duplicate/nested test directories, keeping only the most specific ones
24+
- **Enhanced Output**: Shows count of discovered test directories in summary
25+
- **Backward Compatible**: Single-module projects continue to work as before
26+
27+
### 🔧 Technical Improvements
28+
- Enhanced `ParseTestCaseToLlmContextTask` with `findAllTestDirectories()` method
29+
- Improved `isTestDirectory()` logic with comprehensive filtering rules
30+
- Added deduplication algorithm to prevent processing nested test directories
31+
- Better error handling for individual module failures in mono repos
32+
33+
### 📋 Supported Project Structures
34+
- Single module: `project-root/src/test/java/`
35+
- Multi-module Maven: `module-*/src/test/java/`
36+
- Multi-module Gradle: `subproject-*/src/test/java/`
37+
- Nested modules: `backend/api/src/test/java/`, `backend/core/src/test/java/`
38+
39+
### 🚀 Performance
40+
- Processes multiple test directories in sequence
41+
- Maintains individual module error isolation
42+
- Optimized directory traversal with early filtering
43+
1944
### 🔧 Technical Enhancements
2045
- Enhanced `TestCaseAnalyzer` with `extractLifecycleMethods()` function
2146
- Added `extractMethodSourceCode()` helper method for consistent source code extraction

MONOREPO_SUPPORT.md

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
# Mono Repository (Mono Repo) 支持
2+
3+
## 📋 概述
4+
5+
从v1.1.0开始,Javalang-analyzing-cli增强了对Mono Repository(单体代码库)的支持,能够自动发现和分析多模块项目中的所有测试用例。
6+
7+
## 🔄 改进前 vs 改进后
8+
9+
### 改进前 (v1.0.x)
10+
- ❌ 只搜索根目录下的 `src/test/java`
11+
- ❌ 无法处理多模块项目
12+
- ❌ 对于mono repo结构会遗漏大量测试用例
13+
14+
### 改进后 (v1.1.0+)
15+
- ✅ 递归搜索整个项目目录
16+
- ✅ 自动发现所有子模块的测试目录
17+
- ✅ 智能过滤,跳过构建输出目录
18+
- ✅ 支持标准Maven/Gradle多模块结构
19+
20+
## 🏗️ 支持的项目结构
21+
22+
### 单模块项目
23+
```
24+
project-root/
25+
├── src/test/java/ ← 检测到
26+
└── build.gradle
27+
```
28+
29+
### 多模块Maven项目
30+
```
31+
project-root/
32+
├── module-a/
33+
│ └── src/test/java/ ← 检测到
34+
├── module-b/
35+
│ └── src/test/java/ ← 检测到
36+
├── core/
37+
│ └── src/test/java/ ← 检测到
38+
└── pom.xml
39+
```
40+
41+
### 多模块Gradle项目
42+
```
43+
project-root/
44+
├── app/
45+
│ └── src/test/java/ ← 检测到
46+
├── lib/
47+
│ └── src/test/java/ ← 检测到
48+
├── common/
49+
│ └── src/test/java/ ← 检测到
50+
└── build.gradle
51+
```
52+
53+
### 嵌套模块项目
54+
```
55+
project-root/
56+
├── backend/
57+
│ ├── api/src/test/java/ ← 检测到
58+
│ └── core/src/test/java/ ← 检测到
59+
├── frontend/
60+
│ └── tests/ ← 跳过(非Java)
61+
└── shared/
62+
└── src/test/java/ ← 检测到
63+
```
64+
65+
## 🚀 使用方法
66+
67+
### 基本用法
68+
```bash
69+
java -jar Javalang-analyzing-cli-1.1.0-all.jar ParseTestCaseToLlmContext \
70+
--project /path/to/mono-repo \
71+
--output-dir ./results
72+
```
73+
74+
### 输出示例
75+
```
76+
Found 3 test source directories:
77+
- /path/to/mono-repo/module1/src/test/java
78+
- /path/to/mono-repo/module2/src/test/java
79+
- /path/to/mono-repo/core/src/test/java
80+
Processing file: /path/to/mono-repo/module1/src/test/java/com/example/Module1Test.java
81+
Found test method: testFeatureA
82+
Found @BeforeEach method: setUp
83+
Successfully wrote: results/mono-repo_com.example.Module1Test_testFeatureA.json
84+
...
85+
ParseTestCaseToLlmContext: Found 15 test cases in 3 directories, Generated 15 JSON files.
86+
```
87+
88+
## 🔍 检测算法
89+
90+
### 目录识别规则
91+
工具使用以下规则识别测试目录:
92+
93+
1. **标准模式**: 路径以 `/src/test/java` 结尾
94+
2. **多模块模式**: 包含 `/src/test/` 且以 `/java` 结尾
95+
3. **嵌套检查**: 确保 `java``test``src` 的层级结构
96+
97+
### 智能过滤
98+
自动跳过以下目录:
99+
- 构建输出: `/build/`, `/target/`, `/bin/`, `/out/`
100+
- 版本控制: `/.git/`, `/.svn/`
101+
- 工具缓存: `/.gradle/`, `/.m2/`
102+
- 隐藏目录: 以 `.` 开头的目录
103+
- Node.js: `/node_modules/`
104+
105+
### 去重机制
106+
- 自动移除嵌套的重复目录
107+
- 只保留最具体的测试源目录
108+
109+
## ⚠️ 已知限制
110+
111+
### 1. 构建工具要求
112+
- 根目录或子模块需要有有效的构建文件(`pom.xml``build.gradle`
113+
- 用于依赖解析和classpath配置
114+
115+
### 2. 依赖解析
116+
- 如果依赖无法解析,可能影响AST解析质量
117+
- 工具会尝试从本地缓存中查找通用测试依赖作为fallback
118+
119+
### 3. 性能考虑
120+
- 大型mono repo可能需要较长处理时间
121+
- 建议使用 `--threads` 参数并行处理
122+
123+
## 🛠️ 故障排除
124+
125+
### 问题:找不到测试目录
126+
```
127+
No test source roots found in project: /path/to/project
128+
```
129+
**解决方案**
130+
1. 确保项目使用标准的 `src/test/java` 结构
131+
2. 检查目录权限
132+
3. 确认不在被过滤的目录中
133+
134+
### 问题:AST解析失败
135+
```
136+
Error executing task: IllegalArgumentException
137+
```
138+
**解决方案**
139+
1. 确保项目根目录有构建文件
140+
2. 检查依赖是否正确配置
141+
3. 尝试运行 `gradle build``mvn compile` 确保项目能正常构建
142+
143+
### 问题:部分模块未处理
144+
**解决方案**
145+
1. 检查每个子模块是否有独立的构建文件
146+
2. 确认测试目录结构符合标准
147+
3. 查看日志中的具体错误信息
148+
149+
## 📊 性能优化建议
150+
151+
### 大型项目
152+
```bash
153+
# 使用多线程处理
154+
java -jar Javalang-analyzing-cli-1.1.0-all.jar ParseTestCaseToLlmContext \
155+
--project /path/to/large-mono-repo \
156+
--threads 8 \
157+
--output-dir ./results
158+
```
159+
160+
### 内存配置
161+
```bash
162+
# 为大型项目增加内存
163+
java -Xmx4g -jar Javalang-analyzing-cli-1.1.0-all.jar ...
164+
```
165+
166+
## 🔄 升级指南
167+
168+
### 从v1.0.x升级
169+
1. 下载新版本JAR文件
170+
2. 命令行参数保持不变
171+
3. 输出格式向后兼容
172+
4. 新版本会自动发现更多测试用例
173+
174+
### 验证升级效果
175+
```bash
176+
# 比较分析结果数量
177+
echo "v1.0.x结果数量: $(ls old-results/*.json | wc -l)"
178+
echo "v1.1.0结果数量: $(ls new-results/*.json | wc -l)"
179+
```
180+
181+
## 🤝 贡献
182+
183+
如果您的mono repo项目结构不被支持,请:
184+
1. 提交GitHub Issue描述项目结构
185+
2. 提供目录结构示例
186+
3. 我们会考虑添加支持

0 commit comments

Comments
 (0)