性能测试规范
定义性能测试策略、指标和自动化方案
性能测试类型
| 类型 | 目的 | 执行时机 |
|---|---|---|
| 基准测试 | 建立性能基线 | 版本发布前 |
| 回归测试 | 检测性能退化 | 每次 PR |
| 负载测试 | 验证并发能力 | 重大变更后 |
| 压力测试 | 找到性能瓶颈 | 定期执行 |
关键性能指标
加载性能
| 指标 | 目标值 | 测量工具 |
|---|---|---|
| FCP (首次内容绘制) | < 1.5s | Lighthouse |
| LCP (最大内容绘制) | < 2.5s | Lighthouse |
| TTI (可交互时间) | < 3.5s | Lighthouse |
| TBT (总阻塞时间) | < 300ms | Lighthouse |
| CLS (累积布局偏移) | < 0.1 | Lighthouse |
运行时性能
| 指标 | 目标值 | 测量方式 |
|---|---|---|
| 页面切换 | < 300ms | 自定义计时 |
| 列表滚动 FPS | 60fps | Performance Observer |
| 内存峰值 | < 200MB | Performance.memory |
| 长任务 | < 50ms | Long Tasks API |
关键操作性能
| 操作 | 目标时间 | 说明 |
|---|---|---|
| 钱包列表渲染 | < 100ms | 10 个钱包 |
| 余额刷新 | < 2s | 网络请求 |
| 交易签名 | < 200ms | 本地计算 |
| 二维码识别 | < 100ms | 扫码延迟 |
自动化性能测试
Lighthouse CI 配置
LighthouseCI {
collect: {
url: ['/', '/wallet', '/send', '/settings']
numberOfRuns: 3
}
assert: {
assertions: {
'first-contentful-paint': ['error', {maxNumericValue: 1500}]
'largest-contentful-paint': ['error', {maxNumericValue: 2500}]
'interactive': ['error', {maxNumericValue: 3500}]
'cumulative-layout-shift': ['error', {maxNumericValue: 0.1}]
}
}
}运行时性能测试
性能测试用例结构:
describe('Performance', () => {
benchmark('wallet list render', () => {
// 渲染 10 个钱包卡片
// 断言: 渲染时间 < 100ms
})
benchmark('transaction list scroll', () => {
// 滚动 100 条交易
// 断言: 帧率 > 55fps
})
})性能回归检测
CI 集成
PR 提交
│
▼
构建应用
│
▼
运行 Lighthouse
│
▼
对比基线数据
│
├── 性能提升 ──► 通过 + 标记改进
│
├── 无显著变化 ──► 通过
│
└── 性能下降
│
├── < 10% ──► 警告
│
└── > 10% ──► 阻止合并基线管理
| 环境 | 更新频率 | 存储位置 |
|---|---|---|
| 开发环境 | 每次发布 | CI artifacts |
| 生产环境 | 每周 | 监控系统 |
性能测试场景
场景 1: 冷启动
测试步骤:
- 清除所有缓存
- 打开应用
- 测量至首屏可见
验证点:
- FCP < 1.5s
- TTI < 3.5s
- 无布局抖动
场景 2: 热启动
测试步骤:
- 应用已缓存
- 打开应用
- 测量至首屏可见
验证点:
- FCP < 0.5s
- TTI < 1s
场景 3: 大数据量
测试步骤:
- 创建 10 个钱包
- 每个钱包 5 条链
- 渲染钱包列表
验证点:
- 列表渲染 < 200ms
- 滚动流畅 (60fps)
- 内存 < 150MB
场景 4: 弱网环境
测试步骤:
- 模拟 3G 网络 (750kb/s, 400ms RTT)
- 刷新余额
- 测量完成时间
验证点:
- 显示加载状态
- 超时处理正确
- 不阻塞用户操作
场景 5: 频繁操作
测试步骤:
- 快速切换 10 个钱包
- 测量响应时间和内存
验证点:
- 切换响应 < 100ms
- 无内存泄漏
- 无页面卡顿
包体积监控
Bundle 分析
| 检查项 | 阈值 | 动作 |
|---|---|---|
| 总 JS (gzip) | > 400KB | 阻止 |
| 单 chunk | > 50KB | 警告 |
| 新增依赖 | > 20KB | 审查 |
依赖审计
- MUST 每次 PR 检查新增依赖大小
- SHOULD 大依赖必须说明理由
- SHOULD 寻找更小的替代方案
性能测试环境
设备矩阵
| 设备类型 | 配置 | 用途 |
|---|---|---|
| 低端 Android | Moto G4, 慢 4G | 最低性能基准 |
| 中端 Android | Pixel 3a | 主要目标用户 |
| iPhone SE | iOS 14 | iOS 低端 |
| iPhone 13 | iOS 16 | iOS 标准 |
网络条件
| 类型 | 下载 | 上传 | RTT |
|---|---|---|---|
| 4G | 9Mbps | 1.5Mbps | 170ms |
| 3G | 750Kbps | 250Kbps | 400ms |
| 慢 3G | 400Kbps | 400Kbps | 2000ms |
| 离线 | 0 | 0 | ∞ |
性能优化建议
检测到问题时
| 问题 | 可能原因 | 优化方向 |
|---|---|---|
| FCP 过慢 | 首屏 JS 过大 | 代码分割 |
| LCP 过慢 | 图片/字体加载 | 预加载/压缩 |
| TTI 过慢 | 主线程阻塞 | Web Worker |
| CLS 过高 | 动态内容 | 预留空间 |
| 滚动卡顿 | 重渲染 | 虚拟列表 |
| 内存泄漏 | 订阅未清理 | 清理 effect |
本章小结
- 定义明确的性能指标和目标值
- 自动化性能测试集成到 CI
- 性能回归检测阻止退化合并
- 多设备、多网络条件测试覆盖
- 问题检测后有明确优化方向