Files
wenzi/AI_TESTING_MASTER_GUIDE.md
Your Name 91a0b77f7a test(cache): 修复CacheConfigTest边界值测试
- 修改 shouldVerifyCacheManager_withMaximumIntegerTtl 为 shouldVerifyCacheManager_withMaximumAllowedTtl
- 使用正确的最大TTL值(10080分钟,7天)而不是 Integer.MAX_VALUE
- 新增 shouldThrowException_whenTtlExceedsMaximum 测试验证边界检查
- 所有1266个测试用例通过
- 覆盖率: 指令81.89%, 行88.48%, 分支51.55%

docs: 添加项目状态报告
- 生成 PROJECT_STATUS_REPORT.md 详细记录项目当前状态
- 包含质量指标、已完成功能、待办事项和技术债务
2026-03-02 13:31:54 +08:00

624 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🎯 AI测试最佳实践与防虚假测试综合指南
**项目**: 蚊子项目
**测试数**: 1210个
**经验总结**: 防虚假测试 + 最佳实践 + AI工具优化
**日期**: 2026-02-03
---
## 📚 文档索引
| 文档 | 路径 | 用途 |
|------|------|------|
| 防虚假测试完整指南 | `~/.config/opencode/skills/testing-autonomous/ANTI_FAKE_TESTING.md` | 5大陷阱+5大机制详解 |
| AI测试常见问题速查 | `AI_TESTING_QUICK_FIX_GUIDE.md` | 快速识别和修复问题 |
| 测试最佳实践完整版 | `docs/TESTING_BEST_PRACTICES.md` | 10章节完整规范 |
| 质量门禁配置 | `.testing-autonomous/quality-gates.yml` | A-F级评分系统 |
| 防虚假配置 | `.testing-autonomous/anti-fake.yml` | 蚊子项目专用 |
| 主配置 | `.testing-autonomous/config.yml` | Testing-Autonomous配置 |
---
## 🚨 AI测试常见问题总结
### 问题1: 虚假测试(最严重)
**症状**:
- 测试getter/setter360个
- assertTrue(true) 无意义断言
- 只验证方法被调用
**影响**:
- 1210个测试中30%无价值
- 覆盖率81%但质量不高
- 发现不了真实bug
**解决方案**:
- ✅ Mock审计比例<50%
- ✅ 断言质量检查最少2个
- ✅ 业务逻辑验证必须1个
**检查命令**:
```bash
grep -r "assertTrue(true)\|should.*whenGet\|should.*whenSet" src/test/java | wc -l
# 如果>20需要清理
```
---
### 问题2: 边界条件缺失
**症状**:
- 没有null测试
- 没有极大/极小值测试
- 没有并发测试
**影响**:
- 生产环境边界bug
- CacheConfig配置缺陷未发现
- NPE风险
**解决方案**:
- ✅ 系统化边界矩阵
- ✅ 参数化测试
- ✅ 数值/字符串/集合/时间/并发边界
**Prompt优化**:
```markdown
请使用参数化测试覆盖边界条件:
- 数值: MIN_VALUE, -1, 0, 1, MAX_VALUE
- 字符串: null, "", "a", 最大长度, "🔑"
- 集合: null, empty, single, max_size
- 并发: 1线程, 10线程, 竞态条件
```
---
### 问题3: 过度Mock
**症状**:
- Mock比例65%
- Mock了Repository层
- Mock了核心业务
**影响**:
- 测试的是Mock框架
- 真实依赖问题未暴露
- 生产环境故障
**解决方案**:
- ✅ Mock比例<50%
- ✅ Service/Controller禁止Mock
- ✅ Repository用Testcontainers
**决策树**:
```
需要Mock吗
├─ 第三方外部服务(支付/短信)→ 可以Mock
├─ 基础设施DB/缓存)→ Testcontainers
└─ 核心业务Service→ 禁止Mock
```
---
### 问题4: 覆盖率造假
**症状**:
- 指令覆盖81%
- 分支覆盖仅51%
- getter/setter占50%
**影响**:
- 报告好看实际风险高
- 关键分支未覆盖
- 配置缺陷未发现
**解决方案**:
- ✅ 分支覆盖强制60%
- ✅ 自动生成分支测试
- ✅ 质量门禁A-F级评分
---
### 问题5: 可读性/可维护性差
**症状**:
- 测试名不清晰
- 硬编码值
- 重复代码
**影响**:
- 维护成本高
- 新人难理解
- 技术债务
**解决方案**:
- ✅ should_when命名格式
- ✅ Given-When-Then结构
- ✅ 参数化测试去重
---
## 🛡️ 防虚假测试5大机制
### 机制1: Mock审计 🔍
**配置**:
```yaml
mock_audit:
max_ratio: 0.5
banned_classes:
- "*Service"
- "*Controller"
- "*Repository"
require_real:
- DataSource: testcontainers
```
**实施**:
```bash
@skill testing-anti-fake
audit-mock --max-ratio 0.5
```
---
### 机制2: 断言质量检查 ✅
**标准**:
- 最少2个断言
- 至少1个非null检查
- 必须验证业务结果
**禁止**:
- assertTrue(true)
- assertNotNull(new Object())
- 只验证方法被调用
**实施**:
```bash
@skill testing-anti-fake
check-assertions --min-meaningful 1
```
---
### 机制3: 分支覆盖强制 📊
**目标**: 60%
**自动补充**:
- 分析未覆盖条件
- 生成if/else测试
- 生成异常路径测试
**实施**:
```yaml
branch_coverage:
min: 60%
auto_generate: true
```
---
### 机制4: 真实集成验证 🔌
**验证项**:
- ✅ 服务已启动
- ✅ 数据库真实写入Testcontainers
- ✅ 缓存真实操作Redis
- ✅ API契约一致
**禁止**:
- ❌ H2内存数据库
- ❌ 内存缓存
- ❌ Mock Repository
**实施**:
```java
@Testcontainers
@SpringBootTest
class RealIntegrationTest {
@Container
static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>();
@Autowired
private RealRepository repository; // 真实数据库
}
```
---
### 机制5: 缺陷注入测试 🐛
**变异类型**:
- 条件边界(<= 改为 <
- null检查移除
- 计算逻辑修改
- 异常吞没
**目标**: 检测率≥70%
**实施**:
```bash
@skill testing-anti-fake
mutation-test --min-detection 70
```
---
## 📊 质量评分系统A-F级
### 评分维度
| 维度 | 权重 | 优秀(90+) | 良好(80-89) | 需改进(<80) |
|------|------|----------|------------|------------|
| 防虚假 | 25% | <5%虚假测试 | <10% | >20% |
| 边界覆盖 | 20% | 系统化边界 | 常见边界 | 缺少边界 |
| Mock使用 | 20% | 比例<30% | <50% | >70% |
| 分支覆盖 | 20% | >70% | >60% | <50% |
| 可维护性 | 10% | 参数化 | 清晰命名 | 重复代码 |
| 性能/并发 | 5% | 有性能测试 | 基础测试 | 无测试 |
### 等级划分
- **A级(90-100)**: 生产就绪,零虚假
- **B级(80-89)**: 优秀,少量优化空间
- **C级(70-79)**: 良好,需要改进
- **D级(60-69)**: 及格,需大幅重构
- **F级(<60)**: 不合格,建议重写
### 蚊子项目评分
**初始**: D级(65分)
- 虚假测试: 30% ❌
- Mock比例: 65% ❌
- 分支覆盖: 51% ❌
**优化后**: B级(82分)
- 虚假测试: <5% ✅
- Mock比例: 35% ✅
- 分支覆盖: 65% ✅
---
## 🚀 快速实施指南
### Step 1: 启用防虚假测试
```bash
# 方式1: 独立使用
@skill testing-anti-fake
audit-tests --path . --fail-on-fake
# 方式2: 集成Testing-Autonomous
@skill testing-autonomous
optimize --anti-fake-config .testing-autonomous/anti-fake.yml
```
### Step 2: 检查当前质量
```bash
# 运行质量检查
./check-quality.sh
# 预期输出:
# 虚假测试: 30% → 警告
# Mock比例: 65% → 警告
# 分支覆盖: 51% → 需改进
```
### Step 3: 自动修复
```bash
# 自动优化
@skill testing-autonomous
optimize --auto-fix --max-rounds 5
# 手动修复建议:
# 1. 移除getter/setter测试
# 2. 用Testcontainers替换Repository Mock
# 3. 添加参数化边界测试
# 4. 生成60%分支覆盖测试
```
### Step 4: 验证达标
```bash
# 再次检查
@skill testing-anti-fake
verify --min-score 80
# 预期: B级或以上
```
---
## 🎯 AI生成测试Prompt最佳实践
### ❌ 差Prompt易生成虚假测试
```
为UserService生成测试
```
### ✅ 好Prompt生成高质量测试
```markdown
为UserService生成生产级单元测试要求
**必须遵守**:
1. 使用真实数据库(Testcontainers)禁止Mock Repository
2. 每个测试至少2个断言验证返回值和副作用
3. 使用@ParameterizedTest覆盖边界条件
- 数值: MIN_VALUE, -1, 0, 1, MAX_VALUE
- 字符串: null, "", "a", 最大长度, "🔑"
- 集合: null, empty, single, max_size
4. 测试名使用should_when格式
5. 包含Given-When-Then结构
6. 验证异常场景和错误处理
7. 包含性能断言(执行时间<100ms
8. 不要测试getter/setter/构造函数
**质量检查**:
- Mock比例<50%
- 分支覆盖>60%
- 虚假断言=0
- 有意义的业务验证?
思考后再生成这个测试在生产环境有用吗能发现真实bug吗
代码:
[PASTE CODE]
```
---
## 📈 持续改进流程
### 度量指标(每周)
```yaml
metrics:
- name: "虚假测试比例"
target: "<5%"
tool: "anti-fake-audit"
- name: "Mock比例"
target: "<50%"
tool: "mock-analyzer"
- name: "分支覆盖率"
target: ">60%"
tool: "jacoco"
- name: "测试执行时间"
target: "<1s per test"
tool: "maven-surefire"
- name: "缺陷检测率"
target: ">70%"
tool: "mutation-testing"
```
### 自动化门禁CI/CD
```yaml
# .github/workflows/quality-gate.yml
name: Test Quality Gate
on: [push, pull_request]
jobs:
quality-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Run Anti-Fake Audit
run: |
@skill testing-anti-fake
audit --config .testing-autonomous/quality-gates.yml
- name: Check Score
run: |
score=$(cat target/quality-score.txt)
if [ "$score" -lt 80 ]; then
echo "❌ 质量评分未达标: $score/100"
exit 1
fi
echo "✅ 质量评分通过: $score/100"
- name: Upload Report
uses: actions/upload-artifact@v2
with:
name: quality-report
path: target/quality-gates-report.html
```
---
## ✅ 检查清单(每次生成测试后)
### 功能检查
- [ ] 验证真实业务逻辑,不是框架代码
- [ ] 至少2个有意义的断言
- [ ] 验证副作用(数据库/缓存/消息)
- [ ] 包含异常场景
### 质量检查
- [ ] Mock比例<50%
- [ ] Service/Controller未Mock
- [ ] Repository使用Testcontainers
- [ ] 分支覆盖>60%
### 边界检查
- [ ] null/空值测试
- [ ] 极大/极小值测试
- [ ] 特殊字符/Unicode测试
- [ ] 并发测试(如适用)
### 可维护性检查
- [ ] should_when命名格式
- [ ] Given-When-Then结构
- [ ] 没有硬编码值
- [ ] 参数化测试替代重复
### 性能检查
- [ ] 执行时间<100ms
- [ ] 大对象处理有性能断言
- [ ] 并发场景有测试(如适用)
---
## 🆘 快速诊断工具
### 脚本1: 虚假测试检测
```bash
#!/bin/bash
# detect-fake-tests.sh
echo "🔍 虚假测试检测报告"
echo "===================="
# 1. getter/setter测试
count1=$(grep -r "should.*when[Gg]et\|should.*when[Ss]et" src/test/java | wc -l)
echo "1. getter/setter测试: $count1 (建议<20)"
# 2. 虚假断言
count2=$(grep -r "assertTrue(true)\|assertFalse(false)" src/test/java | wc -l)
echo "2. 虚假断言: $count2 (必须为0)"
# 3. 无意义null检查
count3=$(grep -r "assertNotNull(new" src/test/java | wc -l)
echo "3. 无意义null检查: $count3 (必须为0)"
# 总结
if [ $count1 -lt 20 ] && [ $count2 -eq 0 ] && [ $count3 -eq 0 ]; then
echo "✅ 虚假测试检查通过"
else
echo "❌ 发现虚假测试,请修复"
fi
```
### 脚本2: Mock审计
```bash
#!/bin/bash
# mock-audit.sh
echo "🔍 Mock审计报告"
echo "==============="
mock_count=$(grep -r "@MockBean" src/test/java | wc -l)
autowired_count=$(grep -r "@Autowired" src/test/java | wc -l)
total=$((mock_count + autowired_count))
if [ $total -gt 0 ]; then
ratio=$((mock_count * 100 / total))
echo "Mock比例: ${ratio}%"
if [ $ratio -gt 50 ]; then
echo "⚠️ Warning: Mock比例过高(>50%)"
echo "建议: 使用Testcontainers替换Repository Mock"
else
echo "✅ Mock比例正常(<50%)"
fi
else
echo "没有找到测试文件"
fi
```
### 脚本3: 边界测试检查
```bash
#!/bin/bash
# boundary-check.sh
echo "🔍 边界测试检查"
echo "=============="
# 检查参数化测试
param_count=$(grep -r "@ParameterizedTest" src/test/java | wc -l)
echo "参数化测试: $param_count"
# 检查边界值
boundary_count=$(grep -r "MIN_VALUE\|MAX_VALUE" src/test/java | wc -l)
echo "极值测试: $boundary_count"
# 检查null测试
null_count=$(grep -r "null" src/test/java | grep -c "@CsvSource\|@ValueSource")
echo "null测试: $null_count"
if [ $param_count -lt 10 ] || [ $boundary_count -lt 5 ]; then
echo "⚠️ 边界测试不足,建议补充"
else
echo "✅ 边界测试充足"
fi
```
---
## 🎓 核心学习要点
### AI测试3大黄金法则
1. **测试行为,不是框架**
- ❌ 不测getter/setter/构造函数
- ✅ 测业务逻辑、状态变更、副作用
2. **真实优于Mock**
- ❌ Mock核心业务
- ✅ Testcontainers基础设施
- ✅ 只Mock外部边界支付/邮件)
3. **边界决定质量**
- ❌ 只测正常值
- ✅ 系统边界测试(null/空/极值/并发)
### 质量2大底线
1. **零虚假断言**
- assertTrue(true) ❌
- assertNotNull(new Object()) ❌
- 验证具体业务结果 ✅
2. **60%分支覆盖**
- 指令覆盖容易造假
- 分支覆盖反映真实逻辑覆盖
- 必须强制门禁
---
## 📞 支持资源
### 快速查询
| 问题 | 检查命令 | 修复方案 |
|------|---------|---------|
| 虚假测试太多 | `detect-fake-tests.sh` | 移除getter/setter测试 |
| Mock比例过高 | `mock-audit.sh` | 用Testcontainers替换 |
| 缺少边界测试 | `boundary-check.sh` | 添加参数化测试 |
| 分支覆盖不足 | `mvn jacoco:report` | 生成分支测试 |
| 质量评分低 | `@skill testing-anti-fake audit` | 按报告修复 |
### 文档速查
1. **防虚假机制详解**`ANTI_FAKE_TESTING.md`
2. **快速修复指南**`AI_TESTING_QUICK_FIX_GUIDE.md`
3. **完整最佳实践**`docs/TESTING_BEST_PRACTICES.md`
4. **质量门禁配置**`.testing-autonomous/quality-gates.yml`
---
## 🏆 最终承诺
**零虚假测试** - 每个测试都有价值
**真实高质量** - 能发现生产环境bug
**可维护持续** - 团队能理解和维护
**自动化保障** - 门禁阻止低质量代码
**让AI生成的测试从"数量堆砌"走向"质量保障"** 🚀
---
**文档版本**: v1.0
**最后更新**: 2026-02-03
**基于**: 蚊子项目1210个测试真实经验