智能複習系統 - 測試規格書 (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: 逾期復習測試
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: 時間基準專項測試
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: 複習題型選擇測試
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: 選擇題測試
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: 填空題測試
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: 例句重組測試
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: 聽力題測試
Scenario: 詞彙聽力題
Given 音頻檔案播放 "apple"
And 選項 ["apple", "orange", "banana"]
When 用戶選擇 "apple"
Then 答案應標記為正確
Scenario: 音頻載入失敗
Given 音頻檔案不存在或損壞
When 用戶嘗試播放音頻
Then 系統應顯示錯誤訊息
And 提供跳過此題的選項
TC-016: 口說題測試
Scenario: 口說錄音成功
Given 用戶設備支援麥克風
When 用戶開始錄音並說話
Then 應成功錄製音頻檔案
And 檔案大小應 > 0
Scenario: 麥克風權限被拒絕
Given 用戶拒絕麥克風權限
When 系統嘗試開始錄音
Then 應顯示權限請求提示
And 提供手動授權指導
TC-017: 智能推薦系統測試
Scenario: 避免連續重複題型
Given 用戶最近3次都使用翻卡題
When 系統推薦下一個題型
Then 不應推薦翻卡題
And 應從其他可用題型中選擇
Scenario: A1權重分配測試
Given A1學習者可用題型 ["flipcard", "multiple_choice", "vocabulary_listening"]
When 系統執行100次推薦
Then 翻卡題出現約40次,選擇題約40次,聽力題約20次
TC-018: A1學習者專屬測試
Scenario: A1學習者信心建立
Given A1用戶 (userLevel ≤ 20)
When 用戶完成復習
Then 應優先選擇成功率較高的題型
And 應提供更多鼓勵性反饋
Scenario: A1學習者題型限制
Given A1用戶嘗試訪問高難度題型
When 系統檢查用戶程度
Then 應溫和地建議使用基礎題型
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 |
邊界條件測試
# 極值測試
- 間隔 = 0: 應設為最小值 1天
- 間隔 = 999: 應限制為最大值 365天
- timesCorrect > totalReviews: 應拋出異常
- totalReviews = 0: 熟悉程度應為 0%
併發測試
# 同一詞卡多客戶端同時更新
- 10個並發請求更新同一詞卡
- 驗證資料一致性,無競態條件
- 確保間隔計算結果正確
⚡ 性能測試
響應時間測試
| 測試場景 |
目標 |
測試方法 |
| 單次復習記錄 |
< 100ms |
100次請求平均值 |
| 複習列表查詢 |
< 500ms |
查詢50個到期詞卡 |
| 批量數據更新 |
< 5s |
1000個詞卡批量更新 |
| 題型推薦算法 |
< 10ms |
單次計算響應時間 |
| 音頻檔案上傳 |
< 3s |
5MB音頻檔案上傳 |
| 複習題目生成 |
< 200ms |
包含選項和音頻URL |
| A1用戶專屬邏輯 |
< 50ms |
程度檢查和題型篩選 |
併發測試
負載測試場景:
- 100 併發用戶,持續5分鐘
- 1000 併發用戶,持續1分鐘
- 驗證: 響應時間不超過目標2倍,無錯誤
資源消耗測試
- 記憶體: 監控記憶體洩漏,增長 < 10MB
- CPU: 算法計算不應導致CPU過載
- 資料庫連線: 連線池使用合理,無死鎖
🔧 測試環境設定
測試資料準備
-- 創建測試用詞卡數據
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%通過)
複習題型專項測試
非功能測試
整合測試
用戶體驗測試
🐛 缺陷分類
嚴重等級定義
- 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缺陷修復後可發布