276 lines
5.0 KiB
Markdown
276 lines
5.0 KiB
Markdown
# Google 测试标准参考手册
|
||
|
||
Google 测试最佳实践与标准的全面指南。
|
||
|
||
---
|
||
|
||
## AAA 模式(Arrange-Act-Assert)
|
||
|
||
每个测试都应遵循以下结构:
|
||
|
||
### 1. 准备(Arrange)
|
||
```markdown
|
||
**前置条件**:
|
||
- 系统处于已知状态
|
||
- 测试数据已准备
|
||
- 依赖已模拟/配置
|
||
```
|
||
|
||
### 2. 执行(Act)
|
||
```markdown
|
||
**测试步骤**:
|
||
1. 执行操作
|
||
2. 触发行为
|
||
3. 运行操作
|
||
```
|
||
|
||
### 3. 断言(Assert)
|
||
```markdown
|
||
**预期结果**:
|
||
✅ 验证标准
|
||
✅ 可观察的结果
|
||
✅ 系统状态验证
|
||
```
|
||
|
||
---
|
||
|
||
## 测试用例设计原则
|
||
|
||
### 1. 测试用例 ID 命名规范
|
||
```
|
||
TC-[分类]-[编号]
|
||
|
||
示例:
|
||
- TC-CLI-001(CLI 测试)
|
||
- TC-WEB-042(Web 测试)
|
||
- TC-API-103(API 测试)
|
||
- TC-SEC-007(安全测试)
|
||
```
|
||
|
||
### 2. 优先级分类
|
||
|
||
**P0(阻断级)**——发布前必须修复
|
||
- 阻碍核心功能
|
||
- 安全漏洞(SQL 注入、XSS)
|
||
- 数据损坏/丢失
|
||
- 系统崩溃
|
||
|
||
**P1(严重级)**——两周内修复
|
||
- 主要功能故障(存在变通方案)
|
||
- 严重的用户体验下降
|
||
- 性能问题
|
||
|
||
**P2(高级)**——四周内修复
|
||
- 次要功能问题
|
||
- 边缘情况
|
||
- 非关键性缺陷
|
||
|
||
**P3(中级)**——条件允许时修复
|
||
- 外观问题
|
||
- 罕见的边缘情况
|
||
- 锦上添花的改进
|
||
|
||
**P4(低级)**——可选
|
||
- 文档拼写错误
|
||
- 轻微的 UI 对齐问题
|
||
|
||
### 3. 测试类型
|
||
|
||
**单元测试**:
|
||
- 测试单个函数/方法
|
||
- 无外部依赖
|
||
- 执行速度快(<100ms)
|
||
- 覆盖率:语句 ≥80%,分支 ≥75%
|
||
|
||
**集成测试**:
|
||
- 测试组件间的交互
|
||
- 使用真实依赖(数据库、API)
|
||
- 执行时间适中
|
||
- 覆盖率:关键用户路径
|
||
|
||
**端到端测试**:
|
||
- 测试完整的用户工作流
|
||
- 使用真实浏览器/环境
|
||
- 执行速度慢
|
||
- 覆盖率:正常路径 + 关键故障场景
|
||
|
||
**安全测试**:
|
||
- 覆盖 OWASP Top 10
|
||
- 输入验证
|
||
- 身份验证/授权
|
||
- 数据保护
|
||
|
||
---
|
||
|
||
## 覆盖率阈值
|
||
|
||
### 代码覆盖率目标
|
||
- ✅ **语句覆盖率**:≥80%
|
||
- ✅ **分支覆盖率**:≥75%
|
||
- ✅ **函数覆盖率**:≥85%
|
||
- ✅ **行覆盖率**:≥80%
|
||
|
||
### 测试分布(推荐)
|
||
- 单元测试:70%
|
||
- 集成测试:20%
|
||
- 端到端测试:10%
|
||
|
||
---
|
||
|
||
## 测试隔离
|
||
|
||
### 强制性原则
|
||
|
||
1. **不共享状态**
|
||
```typescript
|
||
❌ 错误:测试共享全局变量
|
||
✅ 正确:每个测试使用独立数据
|
||
```
|
||
|
||
2. **每个测试使用新数据**
|
||
```typescript
|
||
beforeEach(() => {
|
||
database.seed(freshData);
|
||
});
|
||
```
|
||
|
||
3. **测试后清理**
|
||
```typescript
|
||
afterEach(() => {
|
||
database.cleanup();
|
||
mockServer.reset();
|
||
});
|
||
```
|
||
|
||
---
|
||
|
||
## 快速失败验证
|
||
|
||
### 关键安全模式
|
||
|
||
```typescript
|
||
// ❌ 错误:回退到模拟数据
|
||
if (error) {
|
||
return getMockData(); // 错误——掩盖问题
|
||
}
|
||
|
||
// ✅ 正确:立即失败
|
||
if (error || !data) {
|
||
throw new Error(error?.message || '操作失败');
|
||
}
|
||
```
|
||
|
||
### 输入验证
|
||
```typescript
|
||
// 在任意操作之前进行验证
|
||
function processSkillName(input: string): void {
|
||
// 先做安全检查
|
||
if (input.includes('..')) {
|
||
throw new ValidationError('检测到路径遍历');
|
||
}
|
||
|
||
if (input.startsWith('/')) {
|
||
throw new ValidationError('不允许使用绝对路径');
|
||
}
|
||
|
||
// 再执行业务逻辑
|
||
return performOperation(input);
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 测试文档标准
|
||
|
||
### 测试用例模板
|
||
```markdown
|
||
### TC-XXX-YYY:描述性标题
|
||
|
||
**优先级**:P0/P1/P2/P3/P4
|
||
**类型**:单元测试/集成测试/端到端测试/安全测试
|
||
**预计耗时**:X 分钟
|
||
|
||
**前置条件**:
|
||
- 具体、可验证的条件
|
||
|
||
**测试步骤**:
|
||
1. 确切的命令或操作
|
||
2. 具体的输入数据
|
||
3. 验证步骤
|
||
|
||
**预期结果**:
|
||
✅ 可衡量的结果
|
||
✅ 具体的验证标准
|
||
|
||
**通过/失败标准**:
|
||
- ✅ 通过:所有验证步骤均成功
|
||
- ❌ 失败:出现任何错误或偏差
|
||
|
||
**潜在缺陷**:
|
||
- 已知的边缘情况
|
||
- 安全隐患
|
||
```
|
||
|
||
---
|
||
|
||
## 质量门禁
|
||
|
||
### 发布标准
|
||
|
||
| 门禁项 | 阈值 | 是否阻断 |
|
||
|--------|------|----------|
|
||
| 测试执行 | 100% | 是 |
|
||
| 通过率 | ≥80% | 是 |
|
||
| P0 缺陷 | 0 | 是 |
|
||
| P1 缺陷 | ≤5 | 是 |
|
||
| 代码覆盖率 | ≥80% | 是 |
|
||
| 安全 | 90% OWASP | 是 |
|
||
|
||
### 每日检查点
|
||
|
||
**晨会**:
|
||
- 昨日进展
|
||
- 今日计划
|
||
- 受阻事项
|
||
|
||
**下班前**:
|
||
- 已执行的测试
|
||
- 通过率
|
||
- 已提交的缺陷
|
||
- 明日计划
|
||
|
||
### 周度审查
|
||
|
||
**周五报告**:
|
||
- 本周总结
|
||
- 基线对比
|
||
- 质量门禁状态
|
||
- 下周计划
|
||
|
||
---
|
||
|
||
## 最佳实践总结
|
||
|
||
### 应做事项:
|
||
- ✅ 编写可重现的测试用例
|
||
- ✅ 每次测试后更新追踪记录
|
||
- ✅ 失败时立即提交缺陷
|
||
- ✅ 遵循 AAA 模式
|
||
- ✅ 保持测试隔离
|
||
- ✅ 记录环境详情
|
||
|
||
### 禁止事项:
|
||
- ❌ 跳过测试文档
|
||
- ❌ 批量更新 CSV
|
||
- ❌ 忽略安全测试
|
||
- ❌ 在生产数据上运行测试
|
||
- ❌ 跳过清理操作
|
||
- ❌ 硬编码测试数据
|
||
|
||
---
|
||
|
||
**参考资料**:
|
||
- [Google 测试博客](https://testing.googleblog.com/)
|
||
- [Google SWE 书籍——测试篇](https://abseil.io/resources/swe-book)
|
||
- [测试金字塔概念](https://martinfowler.com/bliki/TestPyramid.html)
|