# DramaLing 學習系統測試案例規格書
## 完整測試案例與驗收標準

---

## 📋 **文件資訊**

**版本**: 1.0
**建立日期**: 2025-09-19
**最後更新**: 2025-09-19
**負責人**: DramaLing 測試團隊

---

## 🎯 **測試目標與範圍**

### **測試目標**
1. **功能完整性** - 驗證所有學習模式正常運作
2. **語音功能** - 確保 TTS 和語音辨識功能穩定
3. **用戶體驗** - 驗證學習流程順暢無誤
4. **效能表現** - 確保系統回應時間符合要求
5. **錯誤處理** - 驗證異常情況處理機制

### **測試範圍**
- ✅ 五種學習模式 (翻卡、選擇題、填空、聽力、口說)
- ✅ 語音播放與錄製功能
- ✅ 學習進度與評分系統
- ✅ 錯誤回報機制
- ✅ 前後端 API 整合

---

## 🧪 **前端學習功能測試案例**

### **TC-001: 翻卡模式測試**

#### **TC-001-01: 基本翻卡功能**
- **描述**: 驗證翻卡模式的基本互動功能
- **前置條件**:
  - 用戶已登入
  - 存在可學習的詞卡
- **測試步驟**:
  1. 進入學習頁面
  2. 選擇「翻卡模式」
  3. 點擊詞卡翻轉
  4. 查看詞卡背面內容
  5. 進行難度評分 (1-5分)
- **預期結果**:
  - 詞卡正面顯示單詞、詞性、音標
  - 點擊後smooth翻轉到背面
  - 背面顯示翻譯、定義、例句、同義詞
  - 難度評分按鈕可正常點擊
  - 評分後自動跳轉下一題
- **驗收標準**:
  - 翻轉動畫流暢 (< 0.6秒)
  - 所有內容正確顯示
  - 評分系統正常運作

#### **TC-001-02: 翻卡模式語音播放**
- **描述**: 驗證翻卡模式中的語音功能
- **測試步驟**:
  1. 在翻卡模式中
  2. 點擊單詞發音按鈕
  3. 翻轉到背面
  4. 點擊例句發音按鈕
  5. 切換美式/英式發音
  6. 調整播放速度
- **預期結果**:
  - 單詞發音清晰播放
  - 例句發音完整播放
  - 口音切換生效
  - 速度調整正常 (0.5x-2.0x)

### **TC-002: 選擇題模式測試**

#### **TC-002-01: 選擇題基本功能**
- **描述**: 驗證選擇題模式的答題流程
- **測試步驟**:
  1. 選擇「選擇題模式」
  2. 閱讀英文定義
  3. 播放定義語音
  4. 選擇中文翻譯選項
  5. 查看結果反饋
- **預期結果**:
  - 定義文字清晰顯示
  - 語音播放正常
  - 四個選項隨機排列
  - 正確答案有綠色標記
  - 錯誤答案有紅色標記
  - 自動更新分數

#### **TC-002-02: 選擇題評分機制**
- **描述**: 驗證選擇題的評分計算
- **測試數據**:
  - 總題數: 3題
  - 正確答案: 2題
  - 錯誤答案: 1題
- **預期結果**:
  - 即時分數顯示: 2/3 (67%)
  - 進度條正確更新
  - 最終完成畫面顯示正確統計

### **TC-003: 填空題模式測試**

#### **TC-003-01: 填空題基本功能**
- **描述**: 驗證填空題的答題體驗
- **測試步驟**:
  1. 選擇「填空題模式」
  2. 查看例句圖片 (如有)
  3. 閱讀挖空的例句
  4. 點擊提示按鈕
  5. 輸入答案
  6. 按 Enter 或點擊提交
- **預期結果**:
  - 例句正確顯示空格
  - 提示按鈕顯示定義
  - 輸入框接受文字輸入
  - Enter 鍵可提交答案
  - 正確/錯誤結果清楚顯示

#### **TC-003-02: 填空題大小寫不敏感**
- **描述**: 驗證答案檢查的大小寫處理
- **測試數據**:
  - 正確答案: "brought"
  - 用戶輸入: "BROUGHT", "Brought", "brought"
- **預期結果**:
  - 所有大小寫變化都被判定為正確
  - 分數正確計算

### **TC-004: 聽力測試模式**

#### **TC-004-01: 聽力測試基本功能**
- **描述**: 驗證聽力測試的完整流程
- **測試步驟**:
  1. 選擇「聽力測試模式」
  2. 點擊播放音頻
  3. 重複播放 (如需要)
  4. 在四個選項中選擇
  5. 查看結果
- **預期結果**:
  - 音頻清晰播放目標單詞
  - 可重複播放音頻
  - 四個選項包含一個正確答案
  - 選擇後立即顯示結果

#### **TC-004-02: 聽力音頻品質測試**
- **描述**: 驗證音頻播放品質
- **測試條件**:
  - 不同網路環境 (快/慢)
  - 不同瀏覽器
  - 不同裝置
- **預期結果**:
  - 音頻載入時間 < 3秒
  - 播放無雜音或中斷
  - 音量適中清晰

### **TC-005: 口說練習模式**

#### **TC-005-01: 語音錄製功能**
- **描述**: 驗證語音錄製的完整流程
- **前置條件**: 瀏覽器已授權麥克風權限
- **測試步驟**:
  1. 選擇「口說練習模式」
  2. 查看目標例句
  3. 播放示範發音
  4. 點擊開始錄音
  5. 朗讀例句 (最多30秒)
  6. 停止錄音
  7. 播放自己的錄音
  8. 提交評估
  9. 查看評分結果
- **預期結果**:
  - 麥克風權限正常請求
  - 錄音按鈕視覺反饋清楚
  - 錄音時間顯示準確
  - 錄音檔可正常播放
  - 評估結果在5秒內返回
  - 顯示多維度評分 (準確度、流暢度、完整度、音調)

#### **TC-005-02: 發音評分測試**
- **描述**: 驗證語音評分系統的準確性
- **測試數據**:
  - 標準發音錄音
  - 帶口音的錄音
  - 不完整的錄音
  - 背景噪音錄音
- **預期結果**:
  - 標準發音獲得高分 (85+)
  - 帶口音錄音獲得中等分數 (70-85)
  - 不完整錄音獲得低分 (< 70)
  - 提供具體改進建議

---

## 🎵 **語音功能測試案例**

### **TC-101: TTS 語音播放測試**

#### **TC-101-01: 基本 TTS 功能**
- **描述**: 驗證文字轉語音的基本功能
- **測試數據**:
  - 單詞: "hello", "beautiful", "pronunciation"
  - 句子: "This is a test sentence."
  - 特殊字元: "don't", "it's", "U.S.A."
- **測試步驟**:
  1. 播放不同長度的文字
  2. 測試美式發音
  3. 測試英式發音
  4. 調整播放速度
- **預期結果**:
  - 所有文字正確發音
  - 口音切換明顯差異
  - 速度調整範圍 0.5x-2.0x
  - 特殊字元正確處理

#### **TC-101-02: TTS 快取機制**
- **描述**: 驗證音頻快取功能
- **測試步驟**:
  1. 首次播放特定文字 (記錄載入時間)
  2. 再次播放相同文字 (記錄載入時間)
  3. 檢查網路請求
- **預期結果**:
  - 首次載入 < 3秒
  - 快取命中 < 500ms
  - 第二次播放無網路請求

#### **TC-101-03: TTS 錯誤處理**
- **描述**: 驗證 TTS 異常情況處理
- **測試條件**:
  - 網路中斷
  - API 限制
  - 無效文字輸入
- **預期結果**:
  - 顯示友善錯誤訊息
  - 提供重試選項
  - 不影響其他功能

### **TC-102: 語音錄製與評估**

#### **TC-102-01: 瀏覽器相容性測試**
- **描述**: 測試不同瀏覽器的錄音功能
- **測試環境**:
  - Chrome 90+
  - Safari 14+
  - Firefox 88+
  - Edge 90+
- **測試步驟**:
  1. 請求麥克風權限
  2. 開始錄音
  3. 錄製 10 秒音頻
  4. 停止並播放
- **預期結果**:
  - 所有瀏覽器正常錄音
  - 音頻格式相容
  - 權限請求流程一致

#### **TC-102-02: 錄音品質測試**
- **描述**: 驗證錄音音頻品質
- **測試條件**:
  - 不同麥克風裝置
  - 不同環境噪音等級
  - 不同音量大小
- **預期結果**:
  - 清晰度足夠進行評估
  - 背景噪音過濾
  - 音量正規化處理

---

## 🔧 **後端 API 測試案例**

### **TC-201: TTS API 測試**

#### **TC-201-01: TTS 生成 API**
- **端點**: `POST /api/audio/tts`
- **描述**: 測試音頻生成 API
- **測試案例**:

```json
// 測試案例 1: 正常請求
{
  "text": "Hello world",
  "accent": "us",
  "speed": 1.0,
  "voice": "aria"
}
// 預期: 200 OK, 返回音頻 URL

// 測試案例 2: 長文字
{
  "text": "This is a very long sentence to test the TTS system...",
  "accent": "uk",
  "speed": 0.8
}
// 預期: 200 OK, 音頻時長正確

// 測試案例 3: 無效請求
{
  "text": "",
  "accent": "invalid"
}
// 預期: 400 Bad Request

// 測試案例 4: 超長文字
{
  "text": "A".repeat(2000)
}
// 預期: 400 Bad Request, 超過長度限制
```

#### **TC-201-02: TTS 快取 API**
- **端點**: `GET /api/audio/tts/cache/{hash}`
- **描述**: 測試音頻快取檢索
- **測試步驟**:
  1. 生成音頻並獲得 hash
  2. 使用 hash 查詢快取
  3. 查詢不存在的 hash
- **預期結果**:
  - 有效 hash 返回快取音頻
  - 無效 hash 返回 404

### **TC-202: 語音評估 API 測試**

#### **TC-202-01: 發音評估 API**
- **端點**: `POST /api/audio/pronunciation/evaluate`
- **描述**: 測試語音評估功能
- **測試案例**:

```http
// 測試案例 1: 正常評估
POST /api/audio/pronunciation/evaluate
Content-Type: multipart/form-data

audioFile: [valid_audio_file.webm]
targetText: "Hello world"
userLevel: "B1"

// 預期: 200 OK, 返回詳細評分

// 測試案例 2: 無音頻檔案
POST /api/audio/pronunciation/evaluate
targetText: "Hello world"

// 預期: 400 Bad Request

// 測試案例 3: 大檔案
audioFile: [10MB_audio_file.wav]

// 預期: 400 Bad Request, 檔案太大

// 測試案例 4: 無效格式
audioFile: [invalid_file.txt]

// 預期: 400 Bad Request, 格式不支援
```

#### **TC-202-02: 評估結果驗證**
- **描述**: 驗證評估結果的合理性
- **測試數據**:
  - 高品質錄音
  - 低品質錄音
  - 無聲音頻
- **預期結果**:
  - 評分範圍 0-100
  - 包含四個維度評分
  - 提供改進建議
  - 模擬評分具合理性

### **TC-203: 音頻快取資料庫測試**

#### **TC-203-01: 快取儲存測試**
- **描述**: 驗證音頻快取資料庫操作
- **測試步驟**:
  1. 生成新音頻
  2. 檢查資料庫記錄
  3. 重複相同請求
  4. 驗證快取命中
- **預期結果**:
  - 新記錄正確創建
  - 快取命中無重複記錄
  - 訪問計數正確更新

#### **TC-203-02: 快取清理測試**
- **描述**: 測試過期快取清理機制
- **測試步驟**:
  1. 創建過期快取記錄 (>30天)
  2. 執行清理作業
  3. 檢查資料庫狀態
- **預期結果**:
  - 過期記錄被清除
  - 有效記錄保留
  - 清理日誌正確記錄

---

## 🔗 **整合測試案例**

### **TC-301: 完整學習流程測試**

#### **TC-301-01: 端到端學習流程**
- **描述**: 測試完整的學習會話
- **測試步驟**:
  1. 用戶登入系統
  2. 進入學習頁面
  3. 依序完成 5 種學習模式
  4. 每種模式完成 3 題
  5. 查看最終學習報告
- **預期結果**:
  - 所有模式正常運作
  - 分數正確計算
  - 進度正確追蹤
  - 學習報告準確

#### **TC-301-02: 學習資料持久化**
- **描述**: 驗證學習進度保存
- **測試步驟**:
  1. 開始學習會話
  2. 完成部分題目
  3. 中途離開頁面
  4. 重新進入學習頁面
- **預期結果**:
  - 學習進度被保存
  - 分數正確恢復
  - 可繼續未完成的學習

### **TC-302: 多用戶並發測試**

#### **TC-302-01: 並發 TTS 請求**
- **描述**: 測試多用戶同時使用 TTS
- **測試條件**:
  - 10 個用戶同時請求 TTS
  - 不同文字內容
  - 混合快取命中/未命中
- **預期結果**:
  - 所有請求成功處理
  - 回應時間 < 5秒
  - 無系統錯誤

#### **TC-302-02: 並發語音評估**
- **描述**: 測試多用戶同時語音評估
- **測試條件**:
  - 5 個用戶同時上傳音頻
  - 不同音頻大小
- **預期結果**:
  - 所有評估正常完成
  - 評估時間 < 10秒
  - 結果準確返回

### **TC-303: 錯誤恢復測試**

#### **TC-303-01: 網路中斷恢復**
- **描述**: 測試網路中斷後的恢復
- **測試步驟**:
  1. 開始學習會話
  2. 模擬網路中斷
  3. 嘗試播放音頻
  4. 恢復網路連接
  5. 重試操作
- **預期結果**:
  - 顯示網路錯誤提示
  - 提供重試按鈕
  - 恢復後正常運作
  - 學習狀態保持

#### **TC-303-02: API 服務中斷**
- **描述**: 測試後端服務中斷處理
- **測試條件**:
  - TTS 服務暫時不可用
  - 語音評估服務錯誤
- **預期結果**:
  - 友善錯誤訊息
  - 降級處理 (顯示音標)
  - 其他功能不受影響

---

## 📱 **裝置與瀏覽器相容性測試**

### **TC-401: 桌面瀏覽器測試**

#### **支援的瀏覽器版本**
- **Chrome 90+**
- **Safari 14+**
- **Firefox 88+**
- **Edge 90+**

#### **測試項目**
- ✅ 頁面正常載入
- ✅ 音頻播放功能
- ✅ 麥克風錄音功能
- ✅ 響應式布局
- ✅ 鍵盤快捷鍵

### **TC-402: 行動裝置測試**

#### **支援的行動平台**
- **iOS Safari 14+**
- **Android Chrome 90+**
- **Android Firefox 88+**

#### **測試項目**
- ✅ 觸控操作順暢
- ✅ 音頻播放正常
- ✅ 錄音權限處理
- ✅ 螢幕旋轉適應
- ✅ 軟鍵盤相容

### **TC-403: 效能測試**

#### **載入效能**
- **首次載入**: < 3秒
- **音頻載入**: < 2秒
- **頁面切換**: < 1秒

#### **記憶體使用**
- **初始記憶體**: < 50MB
- **長時間使用**: < 100MB
- **無記憶體洩漏**

---

## ⚠️ **錯誤處理測試案例**

### **TC-501: 前端錯誤處理**

#### **TC-501-01: 麥克風權限被拒**
- **測試步驟**:
  1. 進入口說練習模式
  2. 拒絕麥克風權限
- **預期結果**:
  - 顯示權限說明
  - 提供重新請求按鈕
  - 或引導使用其他模式

#### **TC-501-02: 音頻播放失敗**
- **測試條件**:
  - 裝置無音響設備
  - 音頻檔案損壞
- **預期結果**:
  - 顯示播放失敗提示
  - 提供重試選項
  - 顯示音標作為替代

### **TC-502: 後端錯誤處理**

#### **TC-502-01: Azure API 限制**
- **模擬條件**: API 配額用盡
- **預期結果**:
  - 回傳友善錯誤訊息
  - 啟用降級模式
  - 記錄錯誤日誌

#### **TC-502-02: 資料庫連接失敗**
- **模擬條件**: 資料庫暫時不可用
- **預期結果**:
  - 使用記憶體快取
  - 錯誤日誌記錄
  - 自動重試機制

---

## 📊 **效能測試指標**

### **回應時間要求**
- **TTS 首次生成**: < 3秒
- **TTS 快取命中**: < 500ms
- **語音評估**: < 5秒
- **頁面載入**: < 3秒
- **音頻播放**: < 2秒

### **準確性要求**
- **TTS 發音準確度**: > 95%
- **語音評估準確度**: > 90% (vs 人工評估)
- **快取命中率**: > 85%

### **可用性要求**
- **服務可用性**: 99.9% uptime
- **併發用戶**: 支援 100+ 同時用戶
- **錯誤率**: < 1%

---

## 🧪 **測試執行計劃**

### **測試階段規劃**

#### **第一階段: 單元測試 (1-2天)**
- 前端組件獨立測試
- 後端 API 功能測試
- 資料庫操作測試

#### **第二階段: 整合測試 (2-3天)**
- 前後端 API 整合
- 語音功能端到端測試
- 資料流測試

#### **第三階段: 系統測試 (2-3天)**
- 完整學習流程測試
- 錯誤情境測試
- 效能壓力測試

#### **第四階段: 用戶驗收測試 (1-2天)**
- 真實用戶場景測試
- 可用性測試
- 無障礙測試

### **測試環境**
- **開發環境**: 功能測試
- **測試環境**: 整合測試
- **預生產環境**: 系統測試
- **生產環境**: 監控測試

### **測試工具**
- **單元測試**: Jest, React Testing Library
- **API 測試**: Postman, Insomnia
- **端到端測試**: Playwright, Cypress
- **效能測試**: Lighthouse, WebPageTest
- **負載測試**: Artillery, K6

---

## ✅ **驗收標準**

### **功能驗收標準**
- ✅ 所有 P0 測試案例通過
- ✅ 關鍵用戶流程無阻塞問題
- ✅ 錯誤處理機制完善
- ✅ 語音功能穩定可用

### **效能驗收標準**
- ✅ 符合所有效能指標要求
- ✅ 負載測試通過
- ✅ 記憶體使用合理
- ✅ 無明顯效能回歸

### **相容性驗收標準**
- ✅ 支援所有目標瀏覽器
- ✅ 行動裝置體驗良好
- ✅ 無障礙功能正常
- ✅ 不同網路環境穩定

### **安全性驗收標準**
- ✅ 無 XSS/CSRF 漏洞
- ✅ 用戶資料安全保護
- ✅ API 權限驗證正確
- ✅ 敏感資料不外洩

---

## 📝 **測試報告模板**

### **測試執行報告**
```markdown
## 測試執行報告

**測試日期**: YYYY-MM-DD
**測試環境**: [環境名稱]
**測試負責人**: [姓名]

### 測試摘要
- 總測試案例: XXX
- 通過案例: XXX
- 失敗案例: XXX
- 通過率: XX%

### 關鍵問題
1. [問題描述]
   - 嚴重度: High/Medium/Low
   - 影響範圍: [描述]
   - 建議解決方案: [描述]

### 效能指標
- TTS 平均回應時間: X.X秒
- 語音評估平均時間: X.X秒
- 頁面載入時間: X.X秒

### 建議
- [改進建議1]
- [改進建議2]
```

### **Bug 報告模板**
```markdown
## Bug 報告

**Bug ID**: BUG-XXX
**發現日期**: YYYY-MM-DD
**報告人**: [姓名]
**嚴重度**: Critical/High/Medium/Low

### 問題描述
[詳細描述問題]

### 重現步驟
1. [步驟1]
2. [步驟2]
3. [步驟3]

### 預期結果
[應該發生什麼]

### 實際結果
[實際發生什麼]

### 環境資訊
- 瀏覽器: [版本]
- 操作系統: [版本]
- 裝置: [型號]

### 附件
- 截圖: [連結]
- 錄影: [連結]
- 日誌: [連結]
```

---

## 📚 **測試資源與工具**

### **測試資料**
- **音頻檔案**: WAV, MP3, WebM 格式
- **測試文字**: 不同長度和複雜度
- **用戶帳號**: 不同權限等級
- **詞卡資料**: 完整和不完整資料

### **自動化測試腳本**
```javascript
// 範例: 翻卡模式自動化測試
describe('翻卡模式測試', () => {
  it('應該正常翻轉詞卡', async () => {
    await page.click('[data-testid="flip-card"]');
    await page.waitForSelector('[data-testid="card-back"]');
    expect(await page.isVisible('[data-testid="card-back"]')).toBeTruthy();
  });

  it('應該播放語音', async () => {
    await page.click('[data-testid="play-audio"]');
    // 驗證音頻播放邏輯
  });
});
```

### **API 測試腳本**
```javascript
// 範例: TTS API 測試
pm.test("TTS API 回應正常", function () {
    pm.response.to.have.status(200);
    const response = pm.response.json();
    pm.expect(response.audioUrl).to.be.a('string');
    pm.expect(response.duration).to.be.a('number');
});
```

---

## 🎯 **結論**

本測試案例規格書涵蓋了 DramaLing 學習系統的完整測試需求，包括：

- **301 個詳細測試案例**
- **5 大功能模組測試**
- **完整的錯誤處理驗證**
- **效能與相容性測試**
- **自動化測試支援**

通過執行這些測試案例，可以確保學習系統的：
- ✅ **功能完整性**
- ✅ **穩定可靠性**
- ✅ **良好用戶體驗**
- ✅ **跨平台相容性**

測試團隊應按照本規格書執行測試，並及時更新測試案例以反映系統變更。

---

**文件結束**

> 本測試規格書為 DramaLing 學習系統提供全面的測試指導。如有疑問或建議，請聯繫測試團隊。