dramaling-vocab-learning/note/智能複習/智能複習系統-測試規格書.md

433 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 智能複習系統 - 測試規格書 (TSP)
**目標讀者**: QA工程師、測試人員
**版本**: 1.0
**日期**: 2025-09-25
---
## 🎯 **測試範圍**
### **測試目標**
- 驗證間隔計算算法正確性
- 確保逾期處理邏輯合理
- 驗證API輸入輸出正確性
- 確保系統性能符合要求
- 驗證7種複習題型功能正確性
- 測試智能題型推薦算法準確性
- 確保音頻功能在不同設備上正常運作
- 驗證A1學習者專屬邏輯
### **不測試範圍**
- 前端UI/UX測試
- 第三方服務整合測試
- 語音識別準確度 (依賴第三方服務)
- 音頻品質主觀評價
---
## ✅ **功能測試案例**
### **TC-001: 基本間隔計算**
| 測試案例 | 輸入 | 預期輸出 | 優先級 |
|---------|------|---------|--------|
| 新詞答對 | interval=1, isCorrect=true | newInterval=2 | P0 |
| 新詞答錯 | interval=1, isCorrect=false | newInterval=1 | P0 |
| 短期答對 | interval=5, isCorrect=true | newInterval≈9 | P0 |
| 長期答對 | interval=100, isCorrect=true | newInterval≈110 | P1 |
### **TC-002: 信心等級測試**
| 信心等級 | 預期係數 | 測試數據 | 狀態 |
|---------|---------|---------|------|
| 1 (很不確定) | 0.5 | interval=10 → newInterval≈9 | ✅ |
| 3 (一般) | 0.9 | interval=10 → newInterval≈16 | ✅ |
| 5 (很確定) | 1.4 | interval=10 → newInterval≈25 | ✅ |
### **TC-003: 逾期復習測試**
```gherkin
Scenario: 輕度逾期復習 (時間基準驗證)
Given 詞卡預定 2025-09-20 復習,原間隔7
When 用戶在 2025-09-23 復習 (逾期3天)
And 用戶答對,信心等級4
Then 逾期天數 = 3天,應該應用懲罰係數 0.9
And 新間隔 = 7 × 1.8 × 1.1 × 0.9 = 12
And 下次復習日期 = 2025-09-23 + 12天 = 2025-10-05 (以復習當日為基準)
Scenario: 極度逾期復習
Given 詞卡預定 2025-08-20 復習
When 用戶在 2025-09-25 復習 (逾期36天)
And 用戶答對
Then 應該應用重度懲罰係數 0.3
And 熟悉程度應該大幅衰減
```
### **TC-004: 時間基準專項測試**
```gherkin
Scenario: 驗證時間基準計算正確性
Given 詞卡預定 2025-09-20 復習,原間隔14
When 用戶在 2025-09-25 復習 (逾期5天)
And 用戶答對,信心等級4
Then 逾期天數計算 = 5
And 新間隔 = 14 × 1.4 × 1.1 × 0.75 = 16
And 下次復習日期 = 2025-09-25 + 16天 = 2025-10-11
And 而非錯誤的 = 2025-09-20 + 16天 = 2025-10-06
Scenario: 準時復習基準測試
Given 詞卡預定 2025-09-20 復習,原間隔14
When 用戶在 2025-09-20 準時復習
And 用戶答對,信心等級4
Then 逾期天數 = 0天,無懲罰係數
And 新間隔 = 14 × 1.4 × 1.1 = 21
And 下次復習日期 = 2025-09-20 + 21天 = 2025-10-11
```
### **TC-010: 複習題型選擇測試**
```gherkin
Scenario: A1學習者題型選擇
Given 用戶是A1程度學習者 (userLevel = 15)
When 系統為其推薦複習題型
Then 推薦題型應限制為 ["flipcard", "multiple_choice", "vocabulary_listening"]
And 不應推薦 ["fill_blank", "sentence_reconstruction", "sentence_speaking"]
Scenario: 簡單詞彙題型選擇
Given 用戶程度60,詞彙難度40 (difficulty = -20)
When 系統計算適合的複習題型
Then 推薦題型應為 ["sentence_reconstruction", "fill_blank"]
Scenario: 困難詞彙題型選擇
Given 用戶程度40,詞彙難度70 (difficulty = +30)
When 系統計算適合的複習題型
Then 推薦題型應為 ["flipcard", "multiple_choice"]
```
### **TC-011: 翻卡題測試**
| 測試案例 | 輸入 | 預期輸出 | 優先級 |
|---------|------|---------|--------|
| 高信心翻卡 | confidenceLevel=5 | performanceFactor=1.4 | P0 |
| 低信心翻卡 | confidenceLevel=1 | performanceFactor=0.5 | P0 |
| 中等信心翻卡 | confidenceLevel=3 | performanceFactor=0.9 | P1 |
### **TC-012: 選擇題測試**
```gherkin
Scenario: 選擇題答對
Given 詞卡 "apple" 定義 "a red fruit"
When 用戶選擇正確答案 "apple"
Then isCorrect = true
And performanceFactor = 1.1
Scenario: 選擇題答錯
Given 詞卡 "apple" 定義 "a red fruit"
When 用戶選擇錯誤答案 "orange"
Then isCorrect = false
And performanceFactor = 0.6
```
### **TC-013: 填空題測試**
```gherkin
Scenario: 填空題拼字正確
Given 例句 "I eat an ___ every day"
And 正確答案 "apple"
When 用戶填入 "apple"
Then 答案應標記為正確
Scenario: 填空題大小寫不敏感
Given 例句 "I eat an ___ every day"
And 正確答案 "apple"
When 用戶填入 "Apple" 或 "APPLE"
Then 答案應標記為正確
```
### **TC-014: 例句重組測試**
```gherkin
Scenario: 句子重組正確
Given 打亂的單字 ["I", "eat", "an", "apple"]
And 正確順序 "I eat an apple"
When 用戶重組為 "I eat an apple"
Then 答案應標記為正確
Scenario: 句子重組順序錯誤
Given 打亂的單字 ["I", "eat", "an", "apple"]
When 用戶重組為 "apple eat I an"
Then 答案應標記為錯誤
```
### **TC-015: 聽力題測試**
```gherkin
Scenario: 詞彙聽力題
Given 音頻檔案播放 "apple"
And 選項 ["apple", "orange", "banana"]
When 用戶選擇 "apple"
Then 答案應標記為正確
Scenario: 音頻載入失敗
Given 音頻檔案不存在或損壞
When 用戶嘗試播放音頻
Then 系統應顯示錯誤訊息
And 提供跳過此題的選項
```
### **TC-016: 口說題測試**
```gherkin
Scenario: 口說錄音成功
Given 用戶設備支援麥克風
When 用戶開始錄音並說話
Then 應成功錄製音頻檔案
And 檔案大小應 > 0
Scenario: 麥克風權限被拒絕
Given 用戶拒絕麥克風權限
When 系統嘗試開始錄音
Then 應顯示權限請求提示
And 提供手動授權指導
```
### **TC-017: 智能自動選擇系統測試**
```gherkin
Scenario: 自動避免連續重複題型
Given 用戶最近3次都使用翻卡題
When 系統自動選擇下一個題型
Then 不應選擇翻卡題
And 應自動從其他適配題型中選擇
Scenario: A1學習者自動保護測試
Given A1學習者 (userLevel = 15)
When 系統自動選擇題型100
Then 只應出現 ["flipcard", "multiple_choice", "vocabulary_listening"]
And 不應出現任何高階題型
Scenario: 四情境自動適配測試
Given 簡單詞彙情境 (userLevel=70, wordLevel=40)
When 系統自動選擇題型
Then 應選擇 ["sentence_reconstruction", "fill_blank"] 中的一種
And 不應選擇基礎題型
```
### **TC-018: A1學習者無障礙體驗測試**
```gherkin
Scenario: A1學習者自動信心建立
Given A1用戶 (userLevel ≤ 20)
When 系統自動選擇並執行復習
Then 應自動選擇成功率較高的基礎題型
And 應提供鼓勵性反饋
And 用戶無需了解題型複雜度
Scenario: A1學習者零選擇體驗
Given A1用戶進入復習頁面
When 用戶看到復習界面
Then 不應顯示任何題型選擇選項
And 應直接顯示適合的題目
And 應顯示"系統智能選擇"提示
```
---
## ❌ **負向測試案例**
### **輸入驗證測試**
| 測試案例 | 輸入值 | 預期結果 | 錯誤代碼 |
|---------|-------|---------|----------|
| 信心等級過高 | confidenceLevel=6 | 400錯誤 | VALUE_OUT_OF_RANGE |
| 信心等級過低 | confidenceLevel=0 | 400錯誤 | VALUE_OUT_OF_RANGE |
| 缺少必填欄位 | {} | 400錯誤 | MISSING_REQUIRED_FIELD |
| 錯誤資料類型 | isCorrect="yes" | 400錯誤 | INVALID_INPUT |
| 不存在詞卡ID | id=99999 | 404錯誤 | FLASHCARD_NOT_FOUND |
| 不支援的題型 | questionType="unknown" | 400錯誤 | INVALID_QUESTION_TYPE |
| 空白用戶答案 | userAnswer="" | 400錯誤 | EMPTY_ANSWER |
| 音頻檔案過大 | audioFile > 10MB | 413錯誤 | FILE_TOO_LARGE |
| 用戶程度異常 | userLevel = -1 | 400錯誤 | INVALID_USER_LEVEL |
| 詞彙程度異常 | wordLevel > 100 | 400錯誤 | INVALID_WORD_LEVEL |
### **邊界條件測試**
```
# 極值測試
- 間隔 = 0: 應設為最小值 1天
- 間隔 = 999: 應限制為最大值 365天
- timesCorrect > totalReviews: 應拋出異常
- totalReviews = 0: 熟悉程度應為 0%
# 自動選擇邊界測試
- userLevel = 20: 應為A1學習者邊界限制基礎題型
- difficulty = -10: 簡單詞彙邊界,應選擇應用題型
- difficulty = 10: 適中詞彙邊界,應選擇全方位題型
- 無歷史記錄: 系統應能正常選擇題型
```
### **併發測試**
```
# 同一詞卡多客戶端同時更新
- 10個並發請求更新同一詞卡
- 驗證資料一致性,無競態條件
- 確保間隔計算結果正確
```
---
## ⚡ **性能測試**
### **響應時間測試**
| 測試場景 | 目標 | 測試方法 |
|---------|------|---------|
| 單次復習記錄 | < 100ms | 100次請求平均值 |
| 複習列表查詢 | < 500ms | 查詢50個到期詞卡 |
| 批量數據更新 | < 5s | 1000個詞卡批量更新 |
| 智能題型選擇算法 | < 10ms | 單次自動選擇響應時間 |
| 音頻檔案上傳 | < 3s | 5MB音頻檔案上傳 |
| 複習題目自動生成 | < 200ms | 包含題型選擇和題目生成 |
| A1用戶自動保護邏輯 | < 50ms | 程度檢查和題型自動篩選 |
| 四情境智能適配 | < 5ms | 難度計算和題型映射 |
### **併發測試**
```
負載測試場景:
- 100 併發用戶持續5分鐘
- 1000 併發用戶持續1分鐘
- 驗證: 響應時間不超過目標2倍無錯誤
```
### **資源消耗測試**
- **記憶體**: 監控記憶體洩漏增長 < 10MB
- **CPU**: 算法計算不應導致CPU過載
- **資料庫連線**: 連線池使用合理無死鎖
---
## 🔧 **測試環境設定**
### **測試資料準備**
```sql
-- 創建測試用詞卡數據
INSERT INTO Flashcards (Word, Definition, Example, NextReviewDate, IntervalDays, TimesCorrect, TotalReviews, UserLevel, WordLevel)
VALUES
('test1', 'a test word', 'This is a test1 example', '2025-09-25', 1, 0, 0, 15, 20), -- A1新詞卡
('test2', 'another test word', 'This is a test2 example', '2025-09-20', 7, 3, 4, 60, 40), -- 簡單逾期詞卡
('test3', 'advanced test word', 'This is a test3 example', '2025-09-25', 30, 8, 10, 50, 50), -- 適中詞卡
('test4', 'difficult test word', 'This is a test4 example', '2025-08-25', 90, 15, 15, 40, 70); -- 困難逾期詞卡
-- 創建測試用音頻資料
INSERT INTO AudioFiles (FlashcardId, AudioType, FilePath)
VALUES
(1, 'vocabulary', '/test-audio/test1-vocab.mp3'),
(1, 'sentence', '/test-audio/test1-sentence.mp3'),
(2, 'vocabulary', '/test-audio/test2-vocab.mp3');
-- 創建測試用選項資料 (選擇題用)
INSERT INTO QuestionOptions (FlashcardId, OptionText, IsCorrect)
VALUES
(1, 'test1', true),
(1, 'wrong1', false),
(1, 'wrong2', false),
(2, 'test2', true),
(2, 'wrong3', false),
(2, 'wrong4', false);
```
### **測試工具**
- **單元測試**: xUnit/NUnit
- **API測試**: Postman/Newman
- **負載測試**: JMeter/k6
- **資料庫測試**: 直接SQL驗證
- **音頻測試**:
- 瀏覽器相容性測試: BrowserStack
- 音頻檔案驗證: FFmpeg
- 錄音功能測試: MediaRecorder API
- **演算法測試**:
- 題型推薦準確性: 自訂測試框架
- A1邏輯驗證: 單元測試 + 模擬資料
- **前端整合測試**: Cypress/Playwright (UI互動)
---
## 📋 **測試檢查清單**
### **功能測試 (必須100%通過)**
- [ ] 所有間隔計算測試案例
- [ ] 信心等級映射正確
- [ ] 逾期處理邏輯正確
- [ ] 熟悉程度計算準確
- [ ] API輸入驗證完整
- [ ] 7種複習題型功能正確
- [ ] 智能題型自動選擇準確
- [ ] A1學習者自動保護邏輯正確
- [ ] 四情境自動適配正確
- [ ] 音頻播放和錄製功能正常
### **複習題型專項測試**
- [ ] 翻卡題信心等級處理
- [ ] 選擇題答案驗證
- [ ] 填空題大小寫處理
- [ ] 例句重組邏輯正確
- [ ] 詞彙聽力音頻播放
- [ ] 例句聽力選項生成
- [ ] 口說題錄音和上傳
### **非功能測試**
- [ ] 響應時間符合要求
- [ ] 併發測試無錯誤
- [ ] 記憶體使用穩定
- [ ] 負向測試全部通過
- [ ] 音頻處理性能達標
- [ ] 題型推薦算法效能
### **整合測試**
- [ ] 與現有系統相容
- [ ] 資料庫操作正確
- [ ] 錯誤處理機制有效
- [ ] 前端題型組件整合
- [ ] 音頻API跨瀏覽器相容
### **零選擇體驗測試**
- [ ] 用戶無需進行任何題型選擇
- [ ] 系統自動選擇提示清晰
- [ ] A1學習者完全無障礙體驗
- [ ] 四情境自動適配透明化
### **用戶體驗測試**
- [ ] A1學習者友好性
- [ ] 自動選擇流暢性
- [ ] 音頻品質可接受
- [ ] 錯誤訊息清晰易懂
---
## 🐛 **缺陷分類**
### **嚴重等級定義**
- **P0 (Blocker)**: 算法計算錯誤系統崩潰主要題型無法使用
- **P1 (Critical)**: 逾期處理錯誤性能不達標音頻功能完全失效
- **P2 (Major)**: 輸入驗證缺失錯誤訊息不準確特定題型功能異常
- **P3 (Minor)**: 日誌格式響應字段缺失音頻品質次佳
- **P4 (Trivial)**: 題型推薦不夠精準A1用戶體驗可優化
### **測試報告模板**
```
缺陷標題: [模組] 簡短描述
重現步驟:
1. 準備測試數據
2. 發送API請求
3. 檢查響應結果
預期結果: XX
實際結果: XX
影響範圍: XX用戶功能
```
---
## 📊 **測試完成標準**
### **通過標準**
- 功能測試用例通過率 = 100%
- 性能測試通過率 95%
- 負向測試覆蓋率 90%
- P0/P1缺陷數量 = 0
### **測試報告**
- 測試執行總結
- 缺陷統計和分析
- 性能測試結果
- 風險評估和建議
---
**測試負責人**: [待指派]
**測試週期**: 1個工作日
**發布建議**: 所有P0/P1缺陷修復後可發布