433 lines
14 KiB
Markdown
433 lines
14 KiB
Markdown
# 智能複習系統 - 測試規格書 (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缺陷修復後可發布 |