# 測試結果解讀指南

## 📊 如何解讀測試結果

### ✅ 成功的測試結果特徵

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
```

