624 lines
13 KiB
Markdown
624 lines
13 KiB
Markdown
|
|
# 🎯 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/setter(360个)
|
|||
|
|
- 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个测试真实经验
|