265 lines
5.6 KiB
Markdown
265 lines
5.6 KiB
Markdown
# 測試結果解讀指南
|
||
|
||
## 📊 如何解讀測試結果
|
||
|
||
### ✅ 成功的測試結果特徵
|
||
|
||
1. **所有檢查通過**:`checks_succeeded: 100%`
|
||
2. **請求成功**:`http_req_failed: 0%`
|
||
3. **閾值通過**:所有閾值顯示 `✓`
|
||
4. **響應時間正常**:在預期的時間範圍內
|
||
|
||
### ❌ 失敗的測試結果特徵
|
||
|
||
1. **連接錯誤**:`connection refused`、`timeout`、`no route to host`
|
||
2. **HTTP 錯誤**:`http_req_failed > 0%`
|
||
3. **檢查失敗**:`checks_succeeded < 100%`
|
||
4. **閾值失敗**:閾值顯示 `✗`
|
||
|
||
## 🔍 常見錯誤及解決方案
|
||
|
||
### 錯誤 1: Connection Refused
|
||
|
||
**錯誤信息:**
|
||
```
|
||
dial tcp 127.0.0.1:8888: connect: connection refused
|
||
```
|
||
|
||
**原因:**
|
||
- API 服務器沒有運行
|
||
- BASE_URL 設置錯誤
|
||
- 服務器運行在不同的端口或地址
|
||
|
||
**解決方案:**
|
||
|
||
```bash
|
||
# 1. 檢查 API 服務器是否運行
|
||
curl https://api.example.com/api/v1/health
|
||
|
||
# 2. 設置正確的 BASE_URL
|
||
export BASE_URL=https://api.example.com
|
||
make smoke-health
|
||
|
||
# 或直接在命令中指定
|
||
make smoke-health BASE_URL=https://api.example.com
|
||
```
|
||
|
||
### 錯誤 2: Timeout
|
||
|
||
**錯誤信息:**
|
||
```
|
||
context deadline exceeded
|
||
```
|
||
|
||
**原因:**
|
||
- 服務器響應太慢
|
||
- 網絡問題
|
||
- 服務器過載
|
||
|
||
**解決方案:**
|
||
|
||
```bash
|
||
# 1. 檢查服務器響應時間
|
||
curl -w "@-" -o /dev/null -s https://api.example.com/api/v1/health <<'EOF'
|
||
time_namelookup: %{time_namelookup}\n
|
||
time_connect: %{time_connect}\n
|
||
time_appconnect: %{time_appconnect}\n
|
||
time_pretransfer: %{time_pretransfer}\n
|
||
time_redirect: %{time_redirect}\n
|
||
time_starttransfer: %{time_starttransfer}\n
|
||
----------\n
|
||
time_total: %{time_total}\n
|
||
EOF
|
||
|
||
# 2. 調整測試的閾值(如果需要)
|
||
# 編輯測試文件,增加響應時間閾值
|
||
```
|
||
|
||
### 錯誤 3: HTTP 4xx/5xx 錯誤
|
||
|
||
**錯誤信息:**
|
||
```
|
||
http_req_failed: 20.00% (4xx/5xx responses)
|
||
```
|
||
|
||
**原因:**
|
||
- API 端點不存在
|
||
- 認證失敗
|
||
- 服務器內部錯誤
|
||
|
||
**解決方案:**
|
||
|
||
```bash
|
||
# 1. 檢查 API 端點是否正確
|
||
curl -v https://api.example.com/api/v1/health
|
||
|
||
# 2. 檢查認證(如果需要)
|
||
curl -H "Authorization: Bearer YOUR_TOKEN" https://api.example.com/api/v1/health
|
||
|
||
# 3. 查看服務器日誌
|
||
# 檢查應用程序的日誌文件
|
||
```
|
||
|
||
### 錯誤 4: 閾值失敗
|
||
|
||
**錯誤信息:**
|
||
```
|
||
✗ 'rate==1.0' rate=95.00%
|
||
```
|
||
|
||
**原因:**
|
||
- 部分請求失敗
|
||
- 部分檢查未通過
|
||
- 性能未達標
|
||
|
||
**解決方案:**
|
||
|
||
```bash
|
||
# 1. 查看詳細的失敗原因
|
||
# 檢查輸出中的具體錯誤信息
|
||
|
||
# 2. 調整閾值(如果合理)
|
||
# 編輯測試文件,調整閾值要求
|
||
# 例如:從 'rate==1.0' 改為 'rate>0.95'
|
||
|
||
# 3. 修復根本問題
|
||
# 如果是服務器問題,需要修復服務器
|
||
```
|
||
|
||
## 📈 測試結果指標說明
|
||
|
||
### HTTP 指標
|
||
|
||
- **http_reqs**: 總請求數
|
||
- **http_req_duration**: 請求持續時間
|
||
- `avg`: 平均時間
|
||
- `min`: 最短時間
|
||
- `max`: 最長時間
|
||
- `p(90)`: 90% 的請求在此時間內完成
|
||
- `p(95)`: 95% 的請求在此時間內完成
|
||
- **http_req_failed**: 失敗的請求百分比
|
||
|
||
### 檢查指標
|
||
|
||
- **checks_total**: 總檢查數
|
||
- **checks_succeeded**: 成功的檢查數
|
||
- **checks_failed**: 失敗的檢查數
|
||
|
||
### 執行指標
|
||
|
||
- **iterations**: 迭代次數
|
||
- **iteration_duration**: 每次迭代的持續時間
|
||
- **vus**: 虛擬用戶數
|
||
|
||
### 網絡指標
|
||
|
||
- **data_received**: 接收的數據量
|
||
- **data_sent**: 發送的數據量
|
||
|
||
## 🎯 閾值說明
|
||
|
||
閾值(Thresholds)是測試的通過標準:
|
||
|
||
- **`rate==1.0`**: 100% 必須通過
|
||
- **`rate>0.95`**: 至少 95% 必須通過
|
||
- **`p(95)<2000`**: 95% 的請求必須在 2000ms 內完成
|
||
- **`rate<0.05`**: 失敗率必須低於 5%
|
||
|
||
## 💡 最佳實踐
|
||
|
||
1. **先運行健康檢查**:確保服務器可用
|
||
```bash
|
||
make smoke-health BASE_URL=https://api.example.com
|
||
```
|
||
|
||
2. **逐步增加負載**:從冒煙測試開始,然後負載測試,最後壓力測試
|
||
|
||
3. **監控關鍵指標**:
|
||
- 響應時間
|
||
- 錯誤率
|
||
- 吞吐量
|
||
|
||
4. **設置合理的閾值**:
|
||
- 開發環境:較寬鬆的閾值
|
||
- 生產環境:嚴格的閾值
|
||
|
||
5. **保存測試結果**:
|
||
```bash
|
||
make run-with-output TEST=tests/smoke/smoke-health-test.js OUTPUT=results.json
|
||
```
|
||
|
||
## 🔧 調試技巧
|
||
|
||
### 1. 使用詳細輸出
|
||
|
||
```bash
|
||
# 查看詳細的請求信息
|
||
k6 run --http-debug tests/smoke/smoke-health-test.js
|
||
```
|
||
|
||
### 2. 檢查網絡連接
|
||
|
||
```bash
|
||
# 測試連接
|
||
curl -v https://api.example.com/api/v1/health
|
||
|
||
# 檢查 DNS
|
||
nslookup api.example.com
|
||
|
||
# 檢查端口
|
||
telnet api.example.com 443
|
||
```
|
||
|
||
### 3. 查看 Docker 日誌
|
||
|
||
```bash
|
||
# 如果使用 Docker,查看容器日誌
|
||
docker logs k6-test
|
||
```
|
||
|
||
### 4. 本地測試
|
||
|
||
```bash
|
||
# 如果本地安裝了 k6,可以直接運行
|
||
export BASE_URL=https://api.example.com
|
||
k6 run tests/smoke/smoke-health-test.js
|
||
```
|
||
|
||
## 📝 示例:解讀你的測試結果
|
||
|
||
### 你的測試結果分析
|
||
|
||
```
|
||
✗ checks: rate==1.0 (實際: 50.00%)
|
||
- 10 個檢查中,5 個通過,5 個失敗
|
||
- 狀態碼檢查:0% 通過(因為連接失敗)
|
||
- 響應時間檢查:100% 通過(沒有實際請求)
|
||
|
||
✗ health_check_success: rate==1.0 (實際: 0.00%)
|
||
- 所有健康檢查都失敗了
|
||
|
||
✓ http_req_duration: p(95)<500 (實際: 0s)
|
||
- 沒有實際請求,所以響應時間為 0
|
||
|
||
http_req_failed: 100.00% (5 out of 5)
|
||
- 所有請求都失敗了
|
||
```
|
||
|
||
### 解決方案
|
||
|
||
```bash
|
||
# 1. 確認 API 服務器地址
|
||
# 例如:https://dev-api.example.com 或 https://localhost:8888
|
||
|
||
# 2. 設置 BASE_URL
|
||
export BASE_URL=https://dev-api.example.com
|
||
|
||
# 3. 重新運行測試
|
||
make smoke-health
|
||
|
||
# 或如果服務器在本地運行
|
||
export BASE_URL=http://localhost:8888
|
||
make smoke-health
|
||
```
|
||
|