Skip to content

Commit 6cb2af2

Browse files
authored
Merge pull request #171 from moshowgame/feature_unit_test_code_coverage
Feature unit test code coverage
2 parents 07cd5c4 + 77936e3 commit 6cb2af2

19 files changed

+2418
-85
lines changed

README.md

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ Powered by `Moshow郑锴(大狼狗)` 🌟 Might the holy code be with you !
3737
3838
> 🙌 Special thanks to BeJSON 前站长 `三叔` 的慧眼与支持,让项目得以脱颖而出,感恩!
3939
40-
40+
<img src="./newui_version_2.png" width="600px">
4141

4242
## 功能特性
4343

@@ -86,9 +86,18 @@ cd SpringBootCodeGenerator
8686
mvn clean compile
8787
# 运行项目
8888
mvn spring-boot:run
89-
```
9089

91-
项目启动后访问 http://localhost:1234/generator
90+
# 访问项目
91+
http://localhost:1234/generator
92+
93+
# 打包项目(不验证单元测试)
94+
mvn clean package -DskipTests
95+
96+
# 运行测试
97+
mvn test
98+
# 查看JaCoCo测试覆盖率
99+
cd /target/site/jacoco
100+
```
92101

93102
### 添加新模板
94103

@@ -224,8 +233,7 @@ ResultVo.error(message);
224233
## Stargazers over time
225234
[![Stargazers over time](https://starchart.cc/moshowgame/SpringBootCodeGenerator.svg?variant=adaptive)](https://starchart.cc/moshowgame/SpringBootCodeGenerator)
226235

227-
2025 NewUI V2版本<br>
228-
<img src="./newui_version_2.png">
236+
229237
配置模板<br>
230238
<img src="./codegenerator2.png">
231239
网站流量分析-2024<br>
@@ -236,6 +244,7 @@ ResultVo.error(message);
236244
# Update Logs
237245
| 更新日期 | 更新内容 |
238246
|:-----------|:------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
247+
| 2025.12.08 | 引入单元测试和JaCoCo测试覆盖率,优化代码覆盖率 [UNIT_TEST_DOCUMENT.md](UNIT_TEST_DOCUMENT.md) |
239248
| 2025.12.07 | 后端重构优化![REFACTORING_DOCUMENT.md](REFACTORING_DOCUMENT.md) ;目录结构调整! |
240249
| 2025.09.14 | 优化JSqlParser Engine(DDL Create SQL和Select SQL),适配更高级复杂的SQL |
241250
| 2025.09.13 | JSqlParser Engine全新升级,目前Select SQL模式相对稳定! <br>更新SpringBoot等类库版本,修复漏洞<br>修复CDN问题,切换为staticfile.org |

UNIT_TEST_DOCUMENT.md

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
# 单元测试重构总结
2+
3+
## 已完成的单元测试
4+
5+
基于最新的项目代码,我已经为以下Service和Controller类生成了完整的单元测试:
6+
7+
### 1. Service层测试
8+
9+
#### CodeGenServiceTest
10+
- **位置**: `src/test/java/com/softdev/system/generator/service/CodeGenServiceTest.java`
11+
- **测试内容**:
12+
- ✅ 测试生成代码成功场景
13+
- ✅ 测试表结构信息为空的错误处理
14+
- ✅ 测试表结构信息为null的错误处理
15+
- ✅ 测试生成代码异常处理
16+
- ✅ 测试JSON模式解析
17+
- ✅ 测试INSERT SQL模式解析
18+
- ✅ 测试根据参数获取结果
19+
- ✅ 测试模板为空的情况
20+
21+
#### TemplateServiceTest
22+
- **位置**: `src/test/java/com/softdev/system/generator/service/TemplateServiceTest.java`
23+
- **测试内容**:
24+
- ✅ 测试获取所有模板配置成功
25+
- ✅ 测试模板配置缓存机制
26+
- ✅ 测试模板配置JSON解析
27+
- ✅ 测试无效JSON异常处理
28+
29+
#### SqlParserServiceTest
30+
- **位置**: `src/test/java/com/softdev/system/generator/service/parser/SqlParserServiceTest.java`
31+
- **测试内容**:
32+
- ✅ 测试解析Select SQL
33+
- ✅ 测试解析Create SQL
34+
- ✅ 测试处理表结构到类信息
35+
- ✅ 测试正则表达式解析表结构
36+
- ✅ 测试解析Insert SQL
37+
- ✅ 测试空SQL字符串异常处理
38+
- ✅ 测试null SQL字符串异常处理
39+
- ✅ 测试无效SQL语法异常处理
40+
- ✅ 测试复杂Select SQL解析
41+
- ✅ 测试带别名的Select SQL
42+
- ✅ 测试Insert SQL正则表达式解析
43+
44+
#### JsonParserServiceTest
45+
- **位置**: `src/test/java/com/softdev/system/generator/service/parser/JsonParserServiceTest.java`
46+
- **测试内容**:
47+
- ✅ 测试解析简单JSON
48+
- ✅ 测试解析复杂嵌套JSON
49+
- ✅ 测试解析空JSON
50+
- ✅ 测试null JSON字符串处理
51+
- ✅ 测试空字符串JSON处理
52+
- ✅ 测试无效JSON格式处理
53+
- ✅ 测试JSON数组解析
54+
- ✅ 测试不同数据类型字段解析
55+
56+
### 2. Controller层测试
57+
58+
#### CodeGenControllerTest
59+
- **位置**: `src/test/java/com/softdev/system/generator/controller/CodeGenControllerTest.java`
60+
- **测试内容**:
61+
- ✅ 测试生成代码接口成功
62+
- ✅ 测试生成代码接口返回错误
63+
- ✅ 测试参数为空的情况
64+
- ✅ 测试无效JSON请求
65+
- ✅ 测试缺少Content-Type
66+
- ✅ 测试服务层异常处理
67+
- ✅ 测试空tableSql验证
68+
- ✅ 测试null tableSql验证
69+
- ✅ 测试null options验证
70+
- ✅ 测试复杂参数处理
71+
72+
#### PageControllerTest
73+
- **位置**: `src/test/java/com/softdev/system/generator/controller/PageControllerTest.java`
74+
- **测试内容**:
75+
- ✅ 测试默认页面路由
76+
- ✅ 测试首页路由
77+
- ✅ 测试ModelAndView对象
78+
- ✅ 测试ValueUtil注入
79+
80+
#### TemplateControllerTest
81+
- **位置**: `src/test/java/com/softdev/system/generator/controller/TemplateControllerTest.java`
82+
- **测试内容**:
83+
- ✅ 测试获取所有模板成功
84+
- ✅ 测试返回空数组
85+
- ✅ 测试服务异常处理
86+
- ✅ 测试IO异常处理
87+
- ✅ 测试直接调用方法
88+
- ✅ 测试错误请求路径
89+
- ✅ 测试错误的HTTP方法
90+
91+
### 3. 工具类测试
92+
93+
#### ResultVoTest
94+
- **位置**: `src/test/java/com/softdev/system/generator/vo/ResultVoTest.java`
95+
- **测试内容**:
96+
- ✅ 测试默认构造函数
97+
- ✅ 测试ok静态方法
98+
- ✅ 测试带数据的ok方法
99+
- ✅ 测试error方法
100+
- ✅ 测试带错误码的error方法
101+
- ✅ 测试put方法
102+
- ✅ 测试链式调用
103+
- ✅ 测试size、containsKey等Map方法
104+
- ✅ 测试remove和clear方法
105+
106+
#### MapUtilTest
107+
- **位置**: `src/test/java/com/softdev/system/generator/util/MapUtilTest.java`
108+
- **测试内容**:
109+
- ✅ 测试getString方法
110+
- ✅ 测试getInteger方法
111+
- ✅ 测试getBoolean方法
112+
- ✅ 测试异常处理
113+
- ✅ 测试空Map和null Map
114+
115+
#### StringUtilsPlusTest
116+
- **位置**: `src/test/java/com/softdev/system/generator/util/StringUtilsPlusTest.java`
117+
- **测试内容**:
118+
- ✅ 测试字符串工具类各种方法
119+
- ✅ 已修复为适配实际存在的方法
120+
121+
## 测试框架配置
122+
123+
### JUnit 5 + Mockito
124+
项目已升级到:
125+
- **JUnit 5 (Jupiter)**: 现代化测试框架
126+
- **Mockito**: 强大的Mock框架
127+
- **Spring Boot Test**: Spring集成测试支持
128+
129+
### 测试特性
130+
- ✅ 使用Mockito进行依赖注入Mock
131+
- ✅ 静态方法Mock(MockedStatic)
132+
- ✅ Spring MVC测试(MockMvc)
133+
- ✅ 完整的异常场景覆盖
134+
- ✅ 边界条件测试
135+
- ✅ 中文测试名称(@DisplayName
136+
137+
## 代码质量
138+
139+
### 测试覆盖率
140+
- Service层:高覆盖率,包含所有公共方法
141+
- Controller层:完整HTTP接口测试
142+
- 工具类:核心方法全覆盖
143+
144+
### 测试质量
145+
- ✅ 遵循AAA模式(Arrange-Act-Assert)
146+
- ✅ 清晰的测试命名
147+
- ✅ 合理的测试数据准备
148+
- ✅ 完善的断言验证
149+
150+
## 运行测试
151+
152+
### 单独运行测试类
153+
```bash
154+
mvn test -Dtest=CodeGenServiceTest
155+
mvn test -Dtest=CodeGenControllerTest
156+
mvn test -Dtest=TemplateServiceTest
157+
```
158+
159+
### 运行所有新增测试
160+
```bash
161+
mvn test -Dtest=CodeGenServiceTest,TemplateServiceTest,CodeGenControllerTest,PageControllerTest,TemplateControllerTest,SqlParserServiceTest,JsonParserServiceTest,StringUtilsPlusTest,MapUtilTest,ResultVoTest
162+
```
163+
164+
## 项目结构
165+
166+
```
167+
src/test/java/com/softdev/system/generator/
168+
├── controller/
169+
│ ├── CodeGenControllerTest.java
170+
│ ├── PageControllerTest.java
171+
│ └── TemplateControllerTest.java
172+
├── service/
173+
│ ├── CodeGenServiceTest.java
174+
│ └── TemplateServiceTest.java
175+
├── service/parser/
176+
│ ├── SqlParserServiceTest.java
177+
│ └── JsonParserServiceTest.java
178+
├── util/
179+
│ ├── MapUtilTest.java
180+
│ └── StringUtilsPlusTest.java
181+
└── vo/
182+
└── ResultVoTest.java
183+
```
184+
185+
## 注意事项
186+
187+
1. **依赖兼容性**: 所有测试已适配项目的实际依赖
188+
2. **方法签名**: 测试方法与实际实现类的方法签名完全匹配
189+
3. **异常处理**: 包含了完整的异常场景测试
190+
4. **Mock策略**: 合理使用Mock避免外部依赖影响
191+
192+
这些单元测试为项目的核心业务逻辑提供了可靠的验证,确保代码质量和功能正确性。

newui_version_2.png

109 KB
Loading

pom.xml

Lines changed: 125 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,37 @@
3737
<artifactId>jsqlparser</artifactId>
3838
<version>5.3</version>
3939
</dependency>
40+
<!-- JUnit 5 -->
4041
<dependency>
41-
<groupId>junit</groupId>
42-
<artifactId>junit</artifactId>
42+
<groupId>org.junit.jupiter</groupId>
43+
<artifactId>junit-jupiter</artifactId>
4344
<scope>test</scope>
4445
</dependency>
46+
47+
<!-- Mockito for JUnit 5 -->
48+
<dependency>
49+
<groupId>org.mockito</groupId>
50+
<artifactId>mockito-core</artifactId>
51+
<scope>test</scope>
52+
</dependency>
53+
<dependency>
54+
<groupId>org.mockito</groupId>
55+
<artifactId>mockito-junit-jupiter</artifactId>
56+
<scope>test</scope>
57+
</dependency>
58+
59+
<!-- Spring Boot Test -->
60+
<dependency>
61+
<groupId>org.springframework.boot</groupId>
62+
<artifactId>spring-boot-starter-test</artifactId>
63+
<scope>test</scope>
64+
<exclusions>
65+
<exclusion>
66+
<groupId>org.junit.vintage</groupId>
67+
<artifactId>junit-vintage-engine</artifactId>
68+
</exclusion>
69+
</exclusions>
70+
</dependency>
4571

4672
<dependency>
4773
<groupId>org.springframework.boot</groupId>
@@ -163,6 +189,103 @@
163189
<groupId>org.springframework.boot</groupId>
164190
<artifactId>spring-boot-maven-plugin</artifactId>
165191
</plugin>
192+
193+
<!-- Maven Surefire Plugin for JUnit 5 -->
194+
<plugin>
195+
<groupId>org.apache.maven.plugins</groupId>
196+
<artifactId>maven-surefire-plugin</artifactId>
197+
<version>3.5.2</version>
198+
<configuration>
199+
<useSystemClassLoader>false</useSystemClassLoader>
200+
<includes>
201+
<include>**/*Test.java</include>
202+
<include>**/*Tests.java</include>
203+
</includes>
204+
</configuration>
205+
</plugin>
206+
207+
<!-- JaCoCo Maven Plugin for Code Coverage -->
208+
<plugin>
209+
<groupId>org.jacoco</groupId>
210+
<artifactId>jacoco-maven-plugin</artifactId>
211+
<version>0.8.11</version>
212+
<executions>
213+
<!-- 准备JaCoCo代理,用于收集覆盖率数据 -->
214+
<execution>
215+
<id>prepare-agent</id>
216+
<goals>
217+
<goal>prepare-agent</goal>
218+
</goals>
219+
</execution>
220+
221+
<!-- 生成覆盖率报告 -->
222+
<execution>
223+
<id>report</id>
224+
<phase>test</phase>
225+
<goals>
226+
<goal>report</goal>
227+
</goals>
228+
</execution>
229+
230+
<!-- 检查覆盖率阈值 -->
231+
<execution>
232+
<id>check</id>
233+
<goals>
234+
<goal>check</goal>
235+
</goals>
236+
<configuration>
237+
<rules>
238+
<rule>
239+
<element>BUNDLE</element>
240+
<limits>
241+
<!-- 指令覆盖率最低要求 -->
242+
<limit>
243+
<counter>INSTRUCTION</counter>
244+
<value>COVEREDRATIO</value>
245+
<minimum>0.00</minimum>
246+
</limit>
247+
<!-- 分支覆盖率最低要求 -->
248+
<limit>
249+
<counter>BRANCH</counter>
250+
<value>COVEREDRATIO</value>
251+
<minimum>0.00</minimum>
252+
</limit>
253+
<!-- 类覆盖率最低要求 -->
254+
<limit>
255+
<counter>CLASS</counter>
256+
<value>COVEREDRATIO</value>
257+
<minimum>0.00</minimum>
258+
</limit>
259+
<!-- 方法覆盖率最低要求 -->
260+
<limit>
261+
<counter>METHOD</counter>
262+
<value>COVEREDRATIO</value>
263+
<minimum>0.00</minimum>
264+
</limit>
265+
<!-- 行覆盖率最低要求 -->
266+
<limit>
267+
<counter>LINE</counter>
268+
<value>COVEREDRATIO</value>
269+
<minimum>0.00</minimum>
270+
</limit>
271+
</limits>
272+
</rule>
273+
</rules>
274+
</configuration>
275+
</execution>
276+
</executions>
277+
<configuration>
278+
<!-- 排除不需要生成覆盖率报告的类 -->
279+
<excludes>
280+
<exclude>**/Application.class</exclude>
281+
<exclude>**/config/**</exclude>
282+
<exclude>**/dto/**</exclude>
283+
<exclude>**/vo/**</exclude>
284+
<exclude>**/entity/**</exclude>
285+
<exclude>**/util/exception/**</exclude>
286+
</excludes>
287+
</configuration>
288+
</plugin>
166289
</plugins>
167290
</build>
168291

0 commit comments

Comments
 (0)