e4721053bd
- 新增异常处理体系(BaseException及其子类) - 优化密码、邮箱、用户名等基础类型 - 添加字典管理、登录日志、操作日志的E2E测试 - 完善API集成测试和安全测试 - 添加性能测试配置和脚本 - 优化OpenAPI配置和全局异常处理器
298 lines
6.5 KiB
Markdown
298 lines
6.5 KiB
Markdown
# 性能测试指南
|
||
|
||
## 概述
|
||
|
||
本目录包含Novalon管理系统的性能测试脚本,使用k6进行负载测试和压力测试。
|
||
|
||
## 前置条件
|
||
|
||
1. **后端服务运行**:
|
||
```bash
|
||
cd novalon-manage-api/manage-app
|
||
mvn spring-boot:run
|
||
```
|
||
|
||
2. **数据库服务运行**:
|
||
```bash
|
||
docker-compose up -d postgres
|
||
```
|
||
|
||
3. **k6安装**:
|
||
```bash
|
||
# macOS
|
||
brew install k6
|
||
|
||
# Linux
|
||
curl https://github.com/grafana/k6/releases/download/v0.50.0/k6-v0.50.0-linux-amd64.tar.gz -L | tar xvz
|
||
sudo mv k6-v0.50.0-linux-amd64/k6 /usr/local/bin/
|
||
```
|
||
|
||
## 测试场景
|
||
|
||
### 1. 基础性能测试
|
||
|
||
**目标**:测试系统在低负载下的性能表现
|
||
|
||
**虚拟用户数**:10
|
||
**持续时间**:7分钟
|
||
**测试接口**:健康检查、登录、用户列表
|
||
|
||
**运行命令**:
|
||
```bash
|
||
k6 run load_test.js
|
||
```
|
||
|
||
**预期结果**:
|
||
- 95%的请求响应时间<500ms
|
||
- 错误率<1%
|
||
- 系统稳定运行
|
||
|
||
### 2. 中等负载测试
|
||
|
||
**目标**:测试系统在中负载下的性能表现
|
||
|
||
**虚拟用户数**:50
|
||
**持续时间**:14分钟
|
||
**测试接口**:健康检查、登录、用户列表、角色列表、字典列表
|
||
|
||
**运行命令**:
|
||
```bash
|
||
k6 run load_test.js
|
||
```
|
||
|
||
**预期结果**:
|
||
- 95%的请求响应时间<500ms
|
||
- 错误率<1%
|
||
- 系统稳定运行
|
||
|
||
### 3. 高负载测试
|
||
|
||
**目标**:测试系统在高负载下的性能表现
|
||
|
||
**虚拟用户数**:100
|
||
**持续时间**:21分钟
|
||
**测试接口**:健康检查、登录、用户列表、角色列表、字典列表、系统配置、通知列表、操作日志
|
||
|
||
**运行命令**:
|
||
```bash
|
||
k6 run load_test.js
|
||
```
|
||
|
||
**预期结果**:
|
||
- 95%的请求响应时间<500ms
|
||
- 99%的请求响应时间<1000ms
|
||
- 错误率<1%
|
||
- 系统稳定运行
|
||
|
||
### 4. 压力测试
|
||
|
||
**目标**:测试系统在极限负载下的性能表现
|
||
|
||
**虚拟用户数**:100
|
||
**持续时间**:12分钟
|
||
**测试接口**:所有主要接口
|
||
|
||
**运行命令**:
|
||
```bash
|
||
k6 run load_test.js
|
||
```
|
||
|
||
**预期结果**:
|
||
- 识别系统性能瓶颈
|
||
- 验证系统稳定性
|
||
- 记录错误率
|
||
|
||
## 性能指标
|
||
|
||
### 关键指标
|
||
|
||
| 指标 | 描述 | 目标值 |
|
||
|------|------|--------|
|
||
| HTTP请求响应时间 | 请求从发送到接收的总时间 | p95<500ms, p99<1000ms |
|
||
| HTTP请求失败率 | 失败请求占总请求的比例 | <1% |
|
||
| HTTP请求速率 | 每秒处理的请求数 | >100请求/秒 |
|
||
| 虚拟用户数 | 并发访问系统的用户数 | 根据测试场景 |
|
||
| 吞吐量 | 系统每秒处理的请求数 | 根据测试场景 |
|
||
|
||
### 性能阈值
|
||
|
||
```javascript
|
||
thresholds: {
|
||
http_req_duration: ['p(95)<500'], // 95%的请求响应时间<500ms
|
||
http_req_failed: ['rate<0.01'], // 错误率<1%
|
||
}
|
||
```
|
||
|
||
## 测试结果分析
|
||
|
||
### 查看测试结果
|
||
|
||
k6会自动生成测试报告,包括:
|
||
|
||
1. **控制台输出**:实时显示测试进度和结果
|
||
2. **HTML报告**:使用`--out`参数生成HTML报告
|
||
3. **JSON报告**:使用`--out`参数生成JSON报告
|
||
|
||
### 生成HTML报告
|
||
|
||
```bash
|
||
k6 run --out html=report.html load_test.js
|
||
open report.html
|
||
```
|
||
|
||
### 生成JSON报告
|
||
|
||
```bash
|
||
k6 run --out json=report.json load_test.js
|
||
```
|
||
|
||
## 性能优化建议
|
||
|
||
### 1. 数据库优化
|
||
|
||
- 添加适当的索引
|
||
- 优化慢查询
|
||
- 使用连接池
|
||
- 考虑读写分离
|
||
|
||
### 2. 缓存优化
|
||
|
||
- 使用Redis缓存热点数据
|
||
- 实现查询结果缓存
|
||
- 使用CDN缓存静态资源
|
||
|
||
### 3. 应用优化
|
||
|
||
- 优化算法复杂度
|
||
- 减少不必要的数据库查询
|
||
- 使用异步处理
|
||
- 实现请求合并
|
||
|
||
### 4. 基础设施优化
|
||
|
||
- 使用负载均衡
|
||
- 水平扩展应用实例
|
||
- 优化网络配置
|
||
- 使用更快的硬件
|
||
|
||
## 故障排查
|
||
|
||
### 问题1:连接超时
|
||
|
||
**症状**:大量请求失败,错误率高
|
||
|
||
**解决方案**:
|
||
- 检查后端服务是否正常运行
|
||
- 检查数据库连接是否正常
|
||
- 增加连接池大小
|
||
- 优化数据库查询
|
||
|
||
### 问题2:响应时间过长
|
||
|
||
**症状**:95%或99%的请求响应时间超过阈值
|
||
|
||
**解决方案**:
|
||
- 分析慢查询日志
|
||
- 添加数据库索引
|
||
- 优化应用逻辑
|
||
- 增加缓存
|
||
|
||
### 问题3:内存溢出
|
||
|
||
**症状**:应用崩溃或性能急剧下降
|
||
|
||
**解决方案**:
|
||
- 增加JVM堆内存
|
||
- 分析内存泄漏
|
||
- 优化对象创建
|
||
- 使用对象池
|
||
|
||
## CI/CD集成
|
||
|
||
### GitHub Actions示例
|
||
|
||
```yaml
|
||
name: Performance Tests
|
||
|
||
on:
|
||
schedule:
|
||
- cron: '0 2 * * *' # 每天凌晨2点运行
|
||
workflow_dispatch:
|
||
|
||
jobs:
|
||
performance-test:
|
||
runs-on: ubuntu-latest
|
||
services:
|
||
postgres:
|
||
image: postgres:15
|
||
env:
|
||
POSTGRES_DB: manage_system
|
||
POSTGRES_USER: postgres
|
||
POSTGRES_PASSWORD: postgres
|
||
ports:
|
||
- 55432:5432
|
||
options: >-
|
||
--health-cmd pg_isready
|
||
--health-interval 10s
|
||
--health-timeout 5s
|
||
--health-retries 5
|
||
|
||
steps:
|
||
- uses: actions/checkout@v3
|
||
|
||
- name: Set up Java
|
||
uses: actions/setup-java@v3
|
||
with:
|
||
java-version: '21'
|
||
distribution: 'temurin'
|
||
|
||
- name: Build backend
|
||
run: |
|
||
cd novalon-manage-api
|
||
mvn clean package -DskipTests
|
||
|
||
- name: Start backend
|
||
run: |
|
||
cd novalon-manage-api/manage-app
|
||
java -jar target/manage-app-1.0.0.jar &
|
||
sleep 30
|
||
|
||
- name: Install k6
|
||
run: |
|
||
curl https://github.com/grafana/k6/releases/download/v0.50.0/k6-v0.50.0-linux-amd64.tar.gz -L | tar xvz
|
||
sudo mv k6-v0.50.0-linux-amd64/k6 /usr/local/bin/
|
||
|
||
- name: Run performance tests
|
||
run: |
|
||
cd performance_tests
|
||
k6 run --out json=performance-results.json load_test.js
|
||
|
||
- name: Upload performance results
|
||
uses: actions/upload-artifact@v3
|
||
with:
|
||
name: performance-results
|
||
path: performance_tests/performance-results.json
|
||
```
|
||
|
||
## 最佳实践
|
||
|
||
1. **在非生产环境运行**:性能测试应该在测试环境或预发布环境运行
|
||
2. **使用真实数据**:使用与生产环境相似的数据量和数据分布
|
||
3. **监控系统资源**:在测试过程中监控CPU、内存、磁盘、网络使用情况
|
||
4. **多次运行**:多次运行测试以获得稳定的结果
|
||
5. **记录基准**:建立性能基准,便于比较和改进
|
||
6. **分析瓶颈**:根据测试结果分析性能瓶颈并优化
|
||
7. **持续优化**:将性能测试集成到CI/CD流水线,持续监控和优化
|
||
|
||
## 联系方式
|
||
|
||
如有问题或建议,请联系:
|
||
- **作者**:张翔
|
||
- **角色**:全栈质量保障与研发效能工程师
|
||
- **项目**:Novalon管理系统
|
||
|
||
---
|
||
|
||
**文档版本**:1.0
|
||
**最后更新**:2026-03-24
|