🧪 Tupalish 胖爹英文 — 功能測試報告

依照 📖 平台操作說明 逐項實測每個功能的操作流程、輸入與輸出

🕒 測試時間:2026/8/3 14:05:15(台北) 🌍 測試環境:本機沙盒(Local D1/R2) ⏱️ 總耗時:261.1 秒 🔧 模式:完整測試(含寫入+AI)
72
測試項目
72
✅ 通過
0
❌ 失敗
100%
通過率

🌐 頁面健康檢查 19/19 通過

頁面 /(首頁) 76ms

🎯 測試目的(依操作說明):依說明「點導覽列進入 首頁」— 頁面能正常載入

⬅️ 輸入(實際請求)
GET /
📋 預期輸出
HTTP 200 且含頁面關鍵字
➡️ 實際輸出結果
HTTP 200,頁面含「胖爹英文」,大小 19.8 KB
頁面 /nibbles(Nibbles 短影音) 13ms

🎯 測試目的(依操作說明):依說明「點導覽列進入 Nibbles 短影音」— 頁面能正常載入

⬅️ 輸入(實際請求)
GET /nibbles
📋 預期輸出
HTTP 200 且含頁面關鍵字
➡️ 實際輸出結果
HTTP 200,頁面含「Nibbles」,大小 8.6 KB
頁面 /library(影音圖書館) 11ms

🎯 測試目的(依操作說明):依說明「點導覽列進入 影音圖書館」— 頁面能正常載入

⬅️ 輸入(實際請求)
GET /library
📋 預期輸出
HTTP 200 且含頁面關鍵字
➡️ 實際輸出結果
HTTP 200,頁面含「圖書館」,大小 9.3 KB
頁面 /pro(Pro 教學專區) 14ms

🎯 測試目的(依操作說明):依說明「點導覽列進入 Pro 教學專區」— 頁面能正常載入

⬅️ 輸入(實際請求)
GET /pro
📋 預期輸出
HTTP 200 且含頁面關鍵字
➡️ 實際輸出結果
HTTP 200,頁面含「Pro」,大小 11.0 KB
頁面 /study(學習專區) 15ms

🎯 測試目的(依操作說明):依說明「點導覽列進入 學習專區」— 頁面能正常載入

⬅️ 輸入(實際請求)
GET /study
📋 預期輸出
HTTP 200 且含頁面關鍵字
➡️ 實際輸出結果
HTTP 200,頁面含「學習專區」,大小 25.1 KB
頁面 /battle(英霸對戰) 21ms

🎯 測試目的(依操作說明):依說明「點導覽列進入 英霸對戰」— 頁面能正常載入

⬅️ 輸入(實際請求)
GET /battle
📋 預期輸出
HTTP 200 且含頁面關鍵字
➡️ 實際輸出結果
HTTP 200,頁面含「對戰」,大小 13.2 KB
頁面 /ai(AI 學習工具) 13ms

🎯 測試目的(依操作說明):依說明「點導覽列進入 AI 學習工具」— 頁面能正常載入

⬅️ 輸入(實際請求)
GET /ai
📋 預期輸出
HTTP 200 且含頁面關鍵字
➡️ 實際輸出結果
HTTP 200,頁面含「AI」,大小 12.6 KB
頁面 /teacher(教師管理平台) 16ms

🎯 測試目的(依操作說明):依說明「點導覽列進入 教師管理平台」— 頁面能正常載入

⬅️ 輸入(實際請求)
GET /teacher
📋 預期輸出
HTTP 200 且含頁面關鍵字
➡️ 實際輸出結果
HTTP 200,頁面含「教師」,大小 10.3 KB
頁面 /community(社群互動) 11ms

🎯 測試目的(依操作說明):依說明「點導覽列進入 社群互動」— 頁面能正常載入

⬅️ 輸入(實際請求)
GET /community
📋 預期輸出
HTTP 200 且含頁面關鍵字
➡️ 實際輸出結果
HTTP 200,頁面含「社群」,大小 10.4 KB
頁面 /partners(合作與公益) 9ms

🎯 測試目的(依操作說明):依說明「點導覽列進入 合作與公益」— 頁面能正常載入

⬅️ 輸入(實際請求)
GET /partners
📋 預期輸出
HTTP 200 且含頁面關鍵字
➡️ 實際輸出結果
HTTP 200,頁面含「合作」,大小 12.4 KB
頁面 /app(小斗英 APP) 6ms

🎯 測試目的(依操作說明):依說明「點導覽列進入 小斗英 APP」— 頁面能正常載入

⬅️ 輸入(實際請求)
GET /app
📋 預期輸出
HTTP 200 且含頁面關鍵字
➡️ 實際輸出結果
HTTP 200,頁面含「小斗英」,大小 11.6 KB
頁面 /guide(平台操作說明) 13ms

🎯 測試目的(依操作說明):依說明「點導覽列進入 平台操作說明」— 頁面能正常載入

⬅️ 輸入(實際請求)
GET /guide
📋 預期輸出
HTTP 200 且含頁面關鍵字
➡️ 實際輸出結果
HTTP 200,頁面含「操作說明」,大小 117.9 KB
靜態資源 /static/logo.png 16ms

🎯 測試目的(依操作說明):品牌 Logo 正常提供

⬅️ 輸入(實際請求)
GET /static/logo.png
📋 預期輸出
HTTP 200 image/png
➡️ 實際輸出結果
HTTP 200, Content-Type=image/png
學習資料 vocab.json 39ms

🎯 測試目的(依操作說明):學習專區「vocab」模組資料檔可載入且為合法 JSON

⬅️ 輸入(實際請求)
GET /static/study/vocab.json
📋 預期輸出
HTTP 200 + JSON 可解析
➡️ 實際輸出結果
HTTP 200,JSON 頂層鍵: levels(270 KB)
學習資料 grammar.json 19ms

🎯 測試目的(依操作說明):學習專區「grammar」模組資料檔可載入且為合法 JSON

⬅️ 輸入(實際請求)
GET /static/study/grammar.json
📋 預期輸出
HTTP 200 + JSON 可解析
➡️ 實際輸出結果
HTTP 200,JSON 頂層鍵: junior, senior(53 KB)
學習資料 exam.json 12ms

🎯 測試目的(依操作說明):學習專區「exam」模組資料檔可載入且為合法 JSON

⬅️ 輸入(實際請求)
GET /static/study/exam.json
📋 預期輸出
HTTP 200 + JSON 可解析
➡️ 實際輸出結果
HTTP 200,JSON 頂層鍵: gsat, cloze, reading, translate(25 KB)
學習資料 listening.json 13ms

🎯 測試目的(依操作說明):學習專區「listening」模組資料檔可載入且為合法 JSON

⬅️ 輸入(實際請求)
GET /static/study/listening.json
📋 預期輸出
HTTP 200 + JSON 可解析
➡️ 實際輸出結果
HTTP 200,JSON 頂層鍵: dictation, cloze, mcq, sound, stress(38 KB)
學習資料 games.json 10ms

🎯 測試目的(依操作說明):學習專區「games」模組資料檔可載入且為合法 JSON

⬅️ 輸入(實際請求)
GET /static/study/games.json
📋 預期輸出
HTTP 200 + JSON 可解析
➡️ 實際輸出結果
HTTP 200,JSON 頂層鍵: sentence, cloze, daily(8 KB)
學習資料 essay_library.json 10ms

🎯 測試目的(依操作說明):學習專區「essay_library」模組資料檔可載入且為合法 JSON

⬅️ 輸入(實際請求)
GET /static/study/essay_library.json
📋 預期輸出
HTTP 200 + JSON 可解析
➡️ 實際輸出結果
HTTP 200,JSON 頂層鍵: pastPrompts, patterns(10 KB)

📡 公開 API 8/8 通過

平台即時統計 8ms

🎯 測試目的(依操作說明):說明「首頁 → 即時統計」— 提供會員/影音/互動數

⬅️ 輸入(實際請求)
GET /api/stats
📋 預期輸出
HTTP 200 + 統計數字
➡️ 實際輸出結果
{"videos":15,"likes":26722,"views":114863,"members":15,"donation_total":3700}
影音清單 13ms

🎯 測試目的(依操作說明):說明「Nibbles → 瀏覽短影音牆」

⬅️ 輸入(實際請求)
GET /api/videos
📋 預期輸出
HTTP 200 + videos 陣列
➡️ 實際輸出結果
HTTP 200,共 15 部影音
月明星榜 / 公告 / 黃頁 / 學校 57ms

🎯 測試目的(依操作說明):社群與合作頁的公開資料

⬅️ 輸入(實際請求)
GET /api/stars|announcements|partners|schools
📋 預期輸出
全部 HTTP 200
➡️ 實際輸出結果
/api/stars ✓ | /api/announcements ✓ | /api/partners ✓ | /api/schools ✓
許願池清單 12ms

🎯 測試目的(依操作說明):說明「社群 → 課程許願池」

⬅️ 輸入(實際請求)
GET /api/wishes
📋 預期輸出
HTTP 200 + 願望清單
➡️ 實際輸出結果
HTTP 200,共 6 個願望
Pro 課程清單 13ms

🎯 測試目的(依操作說明):說明「Pro 專區 → 瀏覽課程」— 5 大分類

⬅️ 輸入(實際請求)
GET /api/pro/courses
📋 預期輸出
HTTP 200 + 課程陣列
➡️ 實際輸出結果
HTTP 200,共 18 門課程
直播場次 21ms

🎯 測試目的(依操作說明):說明「Pro 專區 → 預約直播」場次清單

⬅️ 輸入(實際請求)
GET /api/pro/live
📋 預期輸出
HTTP 200 + sessions
➡️ 實際輸出結果
HTTP 200,共 4 場直播
對戰週排行榜 9ms

🎯 測試目的(依操作說明):說明「對戰 → 週排行榜」

⬅️ 輸入(實際請求)
GET /api/battle/leaderboard
📋 預期輸出
HTTP 200 + 榜單
➡️ 實際輸出結果
{"top":[{"user_id":13,"display_name":"QA測試學生","avatar_emoji":"😄","total_score":768,"games":2,"wins":0},{"user_id":10,"display_name":"QA測試學生","avatar_emoji":"🧑‍🎓","total_score":383,"games":2,"wins":0},{"user_id":12,"display_name":"QA測試好友","avatar_emoji":"👩‍🎓","total_score":280,"games":1,"wins":0 …(截斷)
未登入保護:上傳影音應被擋 18ms

🎯 測試目的(依操作說明):安全性 — 說明指出上傳需登入

⬅️ 輸入(實際請求)
POST /api/videos(無登入)
📋 預期輸出
HTTP 401
➡️ 實際輸出結果
HTTP 401 ✓ 正確拒絕:「請先登入會員才能發表影音喔!」

👤 會員系統 9/9 通過

註冊新帳號(學生) 123ms

🎯 測試目的(依操作說明):說明「會員系統 → 註冊」:填暱稱/Email/密碼 → 自動登入

⬅️ 輸入(實際請求)
POST /api/auth/register {email:[email protected], display_name:QA測試學生, password:******}
📋 預期輸出
註冊成功 + 回傳歡迎訊息 + Session Cookie
➡️ 實際輸出結果
歡迎加入 Tupalish,QA測試學生!🍊(已取得 Cookie)
密碼太短應被擋 11ms

🎯 測試目的(依操作說明):註冊驗證:密碼至少 6 碼

⬅️ 輸入(實際請求)
POST /api/auth/register {password:"123"}
📋 預期輸出
HTTP 400 + 錯誤訊息
➡️ 實際輸出結果
HTTP 400 ✓「密碼至少需 6 個字元」
重複 Email 應被擋 14ms

🎯 測試目的(依操作說明):註冊驗證:同 Email 不能註冊兩次

⬅️ 輸入(實際請求)
POST /api/auth/register(同 [email protected])
📋 預期輸出
HTTP 409
➡️ 實際輸出結果
HTTP 409 ✓「這個 Email 已經註冊過了,請直接登入」
登出 27ms

🎯 測試目的(依操作說明):說明「會員系統 → 登出」

⬅️ 輸入(實際請求)
POST /api/auth/logout
📋 預期輸出
HTTP 200,之後 /me 變未登入
➡️ 實際輸出結果
登出成功,/api/auth/me 已無使用者 ✓
登入 121ms

🎯 測試目的(依操作說明):說明「會員系統 → 登入」:Email+密碼取回身分

⬅️ 輸入(實際請求)
POST /api/auth/login {email:[email protected]}
📋 預期輸出
HTTP 200 + 使用者資料 + Cookie
➡️ 實際輸出結果
登入成功:歡迎回來,QA測試學生!🍊(token ✓,/me 確認身分=QA測試學生)
查詢我的身分 12ms

🎯 測試目的(依操作說明):登入後同步身分/積分

⬅️ 輸入(實際請求)
GET /api/auth/me
📋 預期輸出
HTTP 200 + user 物件
➡️ 實際輸出結果
{"id":16,"username":"qa_stu_cmdncj_fw3z","display_name":"QA測試學生","email":"[email protected]","role":"member","avatar_emoji":"🦊","points":0}
錯誤密碼應被擋 113ms

🎯 測試目的(依操作說明):登入安全驗證

⬅️ 輸入(實際請求)
POST /api/auth/login(錯誤密碼)
📋 預期輸出
HTTP 401
➡️ 實際輸出結果
HTTP 401 ✓「Email 或密碼錯誤」
註冊老師與對戰好友帳號 233ms

🎯 測試目的(依操作說明):為教師平台與好友 PK 測試準備帳號

⬅️ 輸入(實際請求)
註冊 [email protected][email protected]
📋 預期輸出
兩帳號皆註冊成功
➡️ 實際輸出結果
老師 ✓ 好友 ✓
AI 每日額度查詢 18ms

🎯 測試目的(依操作說明):說明「常見問題 → AI 每日額度」

⬅️ 輸入(實際請求)
GET /api/ai/quota(登入)
📋 預期輸出
HTTP 200 + used/limit
➡️ 實際輸出結果
{"tier":"free","used":0,"limit":40,"chatUsed":0,"chatLimit":20}

🎬 Nibbles 短影音 3/3 通過

上傳影音發表(含檔案) 51ms

🎯 測試目的(依操作說明):說明「Nibbles → 上傳影音發表」:選檔案+標題+分類 → 送審 +20 積分

⬅️ 輸入(實際請求)
POST /api/videos multipart {title, category, file:test.mp4}
📋 預期輸出
上傳成功 + pending 審核 + 積分獎勵訊息
➡️ 實際輸出結果
id=18,影音上傳成功!已送交碩士級小編審核,通過後將公開發表。(+20 積分 🎉)
按讚影音 19ms

🎯 測試目的(依操作說明):說明「Nibbles → 按讚與留言」

⬅️ 輸入(實際請求)
POST /api/videos/18/like
📋 預期輸出
HTTP 200 讚數+1
➡️ 實際輸出結果
{"likes":1}
留言互動 28ms

🎯 測試目的(依操作說明):說明「Nibbles → 按讚與留言」:輸入文字送出

⬅️ 輸入(實際請求)
POST /api/videos/18/comments {content}
📋 預期輸出
留言成功並可讀回
➡️ 實際輸出結果
留言成功,該影音現有留言可讀回 ✓

👑 Pro 教學專區 5/5 通過

角色切換器 Demo 43ms

🎯 測試目的(依操作說明):說明「Pro → 角色切換器」:免付費體驗 6 種身分

⬅️ 輸入(實際請求)
POST /api/pro/demo-role {role:"pro"}
📋 預期輸出
HTTP 200,tier 查詢變 pro
➡️ 實際輸出結果
demo_role=pro 生效,tier 查詢回傳 pro ✓
升級 Pro 會員(模擬付款) 18ms

🎯 測試目的(依操作說明):說明「Pro → 升級 Pro」:解鎖課程/直播/批改,效期 30 天

⬅️ 輸入(實際請求)
POST /api/pro/upgrade(登入)
📋 預期輸出
升級成功 + 效期訊息
➡️ 實際輸出結果
🎉 升級成功!QA測試學生 現在是 Pro 高級會員(效期至 2026-09-02)。訂閱費 5% 已提撥公益!
課程詳情(課綱+單元) 19ms

🎯 測試目的(依操作說明):說明「Pro → 瀏覽課程」:點課程卡看課綱

⬅️ 輸入(實際請求)
GET /api/pro/courses/1
📋 預期輸出
HTTP 200 + 課程與 lessons
➡️ 實際輸出結果
{"course":{"id":1,"title":"自然發音 Phonics","description":"26字母+44音素完整攻略,從零開始建立發音基礎","pro_category":"basics","emoji":"🔤","lesson_count":12,"is_pro":1,"teacher_name":"胖爹","enrolled":1280,"rating":4.9,"sort_order":1,"created_at":"2026-07-20 03:14:53","ai_generated":0},"lessons":[{"id":1,"course_id":1,"seq":1,"title":"字母 A-G 的自然發音規則","duration_min":22,"is_free_preview":1,"ai_content":null,"added_month" …(截斷)
預約直播 49ms

🎯 測試目的(依操作說明):說明「Pro → 預約直播」:選場次按預約

⬅️ 輸入(實際請求)
POST /api/pro/live/1/book
📋 預期輸出
預約成功;重複預約被擋(409)
➡️ 實際輸出結果
首次:📅 預約成功!「會考英語考前總複習 LIVE」開播前將提醒您(2026-07-25 20:00);重複預約 → HTTP 409 ✓
AI 作業批改(Pro) 18663ms

🎯 測試目的(依操作說明):說明「Pro → AI 作業批改」:提交作文 → AI 秒批(分數/優點/修正)

⬅️ 輸入(實際請求)
POST /api/pro/homework {hw_type:"essay", title, content:英文短文}
📋 預期輸出
AI 回傳批改結果
➡️ 實際輸出結果
AI 初批完成,作業清單 1 筆,狀態=ai_reviewed

🤖 AI 學習工具 5/5 通過

寓言故事生成 19150ms

🎯 測試目的(依操作說明):說明「AI 工具 → 寓言故事」:輸入主題字 → 英文寓言+中譯

⬅️ 輸入(實際請求)
POST /api/ai/fable {words:"honesty, fox", level:"beginner"}
📋 預期輸出
JSON: title/story/moral/translation
➡️ 實際輸出結果
「The Honest Fox」story 118 字 + 中譯 ✓ moral: Honesty builds trust and good friendships.
單字心智圖 24571ms

🎯 測試目的(依操作說明):說明「AI 工具 → 心智圖」:輸入中心單字 → 相關字網絡

⬅️ 輸入(實際請求)
POST /api/ai/mindmap {topic:"travel"}
📋 預期輸出
JSON: center + branches
➡️ 實際輸出結果
center=travel,6 個分支:Transportation / Accommodation / Sightseeing & Attractions / Travel Activities & Planning / Safety & Emergencies / Food & Dining
胖爹 AI 互動對話 9055ms

🎯 測試目的(依操作說明):說明「AI 工具 → AI 對話」:英文聊天 + 文法建議

⬅️ 輸入(實際請求)
POST /api/ai/chat {messages:[{user:"I goed to school yesterday."}]}
📋 預期輸出
AI 英文回覆 + 💡文法提示
➡️ 實際輸出結果
Nice try! You can say, "I went to school yesterday and met my friend." What did you two do together?

💡 注意不規則動詞:go 的過去式是 went;meet 的過去式是 met。可以說:"I went to school yesterday and met my friend."
中翻英 — AI 出題 6145ms

🎯 測試目的(依操作說明):說明「AI 工具 → 中翻英」步驟 2:AI 給中文句

⬅️ 輸入(實際請求)
POST /api/ai/translate-question {level:"easy"}
📋 預期輸出
JSON: chinese + hint
➡️ 實際輸出結果
出題:「我每天早上搭公車去學校,通常會在車上看書。」hint: take the bus
中翻英 — AI 批改 9160ms

🎯 測試目的(依操作說明):說明「AI 工具 → 中翻英」步驟 3-4:送出翻譯 → 批改

⬅️ 輸入(實際請求)
POST /api/ai/translate {chinese:"我每天走路上學。", answer:"I walk to school every day."}
📋 預期輸出
JSON: score/feedback/better
➡️ 實際輸出結果
score=100,feedback: 非常好!句子語法、用字與語序都很自然,簡單現在式正確地表達了習慣性的動作(每天走路上學)。“walk to school” 和 “every day” 的順序也很符合英文習慣。繼續保持這種正確且簡潔的表達方式!

🏫 教師管理平台 6/6 通過

建立班級(自動產生 6 碼代碼) 24ms

🎯 測試目的(依操作說明):說明「教師 → 建立班級」:輸入班名/機構 → 得專屬代碼

⬅️ 輸入(實際請求)
POST /api/teacher/classes {name:"QA自動測試班", org_name:"QA補習班"}
📋 預期輸出
班級建立 + 6 碼代碼 + 升級教師身分
➡️ 實際輸出結果
班級 id=4,代碼=6HKBZX ✓
學生用代碼加入班級 20ms

🎯 測試目的(依操作說明):說明「學習專區 → 加入班級」:輸入 6 碼代碼

⬅️ 輸入(實際請求)
POST /api/class/join {code:"${code}"}
📋 預期輸出
加入成功 + 回傳班級名稱
➡️ 實際輸出結果
加入「QA自動測試班_cmdncj」(QA補習班)✓
錯誤代碼應被擋 19ms

🎯 測試目的(依操作說明):加入班級驗證

⬅️ 輸入(實際請求)
POST /api/class/join {code:"ZZZZZZ"}
📋 預期輸出
HTTP 404
➡️ 實際輸出結果
HTTP 404 ✓「找不到此班級代碼,請確認後再試」
學生學習進度同步 42ms

🎯 測試目的(依操作說明):說明「加入班級 → 進度自動上傳(只增不減)」

⬅️ 輸入(實際請求)
POST /api/study/progress {learned_words:35, grammar_done:4, exam_done:2, points:120, streak:3}
📋 預期輸出
ok:true;老師端可見
➡️ 實際輸出結果
進度上傳 ✓(並驗證重傳較小值)
老師查看全班學習狀況 20ms

🎯 測試目的(依操作說明):說明「教師 → 查看全班」:單字/文法/試題/積分/AI用量/最後活動

⬅️ 輸入(實際請求)
GET /api/teacher/classes/${id}/students
📋 預期輸出
學生列表含剛同步的進度(35 字,只增不減)
➡️ 實際輸出結果
學生「QA測試學生」單字=35 文法=4 試題=2 積分=undefined ✓ 進度未被小值覆蓋
學生個人詳情 46ms

🎯 測試目的(依操作說明):說明「教師 → 學生詳情」:14 天 AI 圖/功能統計/測驗紀錄

⬅️ 輸入(實際請求)
GET /api/teacher/students/:sid/detail
📋 預期輸出
HTTP 200 + 詳情物件
➡️ 實際輸出結果
詳情鍵: student, aiDaily, quiz, progress

📝 AI 作文專區 9/9 通過

AI 智慧出題 18344ms

🎯 測試目的(依操作說明):說明「AI作文 → AI 智慧出題」:選程度/題型 → 題目+引導問題+提示

⬅️ 輸入(實際請求)
POST /api/essay/prompt {level:"junior", type:"guided", topic:"校園"}
📋 預期輸出
JSON: title/prompt_text/questions/hints
➡️ 實際輸出結果
「Green Week Proposal」引導問題 3 題、建議單字 7 個 ✓
AI 深度批改 46258ms

🎯 測試目的(依操作說明):說明「AI作文 → 深度批改」:四項評分+逐句診斷+3 升級句+全文修改;登入自動存歷程

⬅️ 輸入(實際請求)
POST /api/essay/grade {title, content:含錯誤的英文作文, level:"junior"}
📋 預期輸出
score 0-20 + grade + rubric×4 + issues(tag) + upgrades×3 + improved + essay_id
➡️ 實際輸出結果
得分 4/20(待加強),rubric 4 項 ✓,診斷 8 個問題(分類:主詞動詞一致/句構/介係詞/時態),升級句 3 ✓,已存歷程 essay_id=7
AI 範文 27526ms

🎯 測試目的(依操作說明):說明「AI作文 → AI 範文」:同題範文+結構解析+好句

⬅️ 輸入(實際請求)
POST /api/essay/model {title, prompt_text, level}
📋 預期輸出
JSON: model_essay/structure/good_sentences
➡️ 實際輸出結果
範文 1842 bytes,鍵: essay, translation, structure, highlights
我的歷程 — 紀錄與統計 25ms

🎯 測試目的(依操作說明):說明「AI作文 → 我的歷程」:趨勢/四項能力/常犯錯誤

⬅️ 輸入(實際請求)
GET /api/essay/history + /api/essay/stats
📋 預期輸出
含剛批改的作文;stats 有 trend/radar/weaknesses
➡️ 實際輸出結果
歷程 1 筆;stats 鍵: trend, radar, weaknesses, total
回顧單篇批改報告 17ms

🎯 測試目的(依操作說明):說明「歷程 → 點紀錄回顧完整報告」

⬅️ 輸入(實際請求)
GET /api/essay/${id}
📋 預期輸出
本人可讀取完整批改
➡️ 實際輸出結果
essay_id=7 讀取成功,含 feedback ✓
老師派作文作業 29ms

🎯 測試目的(依操作說明):說明「教師 → 派作文作業」:題目+字數+截止日 → 學生端出現

⬅️ 輸入(實際請求)
POST /api/teacher/assignments {class_id, title, prompt_text, level, min_words:60}
📋 預期輸出
作業建立;學生 GET /api/essay/assignments 看得到
➡️ 實際輸出結果
作業 id=4 已派發,學生端可見「QA作業:My Weekend」✓
學生繳交作業(批改即繳交) 26500ms

🎯 測試目的(依操作說明):說明「AI作文 → 班級作業」:開始寫 → 送批改自動繳交

⬅️ 輸入(實際請求)
POST /api/essay/grade {assignment_id:${aid}}
📋 預期輸出
批改成功且綁定作業
➡️ 實際輸出結果
繳交成功,得分 8/20,essay_id=8
老師查看繳交狀況 + 給評語 60ms

🎯 測試目的(依操作說明):說明「教師 → 派作業」步驟 4-5:看繳交表 → 查看作文 → 留評語

⬅️ 輸入(實際請求)
GET /api/teacher/assignments/${aid} + POST /api/teacher/essays/:eid/comment
📋 預期輸出
繳交表含學生分數;評語寫入後學生可見
➡️ 實際輸出結果
繳交表 ✓ 學生得分=8;評語已寫入且學生端可見 ✓
AI 造句檢查 7099ms

🎯 測試目的(依操作說明):說明「學習專區 → AI 造句」:目標字+句子 → 批改

⬅️ 輸入(實際請求)
POST /api/study/sentence {word:"improve", sentence:"I want to improve my English skill everyday."}
📋 預期輸出
JSON: correct/feedback/better
➡️ 實際輸出結果
correct=false,feedback: 句子中「everyday」應寫成兩個字「every day」(表示「每一天」),而「English skill」通常要用複數「English skills」或直接說「my English」。'improve' 的用法沒問題。

⚔️ 英霸對戰 4/4 通過

單人練習(AI 出 5 題) 17108ms

🎯 測試目的(依操作說明):說明「對戰 → 單人練習」:AI 即時出 5 題 → 作答 → 得分

⬅️ 輸入(實際請求)
POST /api/battle/create {mode:"solo"} → POST /api/battle/:id/submit {answers, ms}
📋 預期輸出
取得 5 題(不含答案)→ 交卷得分
➡️ 實際輸出結果
5 題出題 ✓(答案已隱藏)交卷:答對 4 題,得分 485
好友 PK(房號對戰)完整流程 15748ms

🎯 測試目的(依操作說明):說明「對戰 → 好友 PK」:A 建房拿 6 碼 → B 加入 → 雙方交卷 → 判定勝負

⬅️ 輸入(實際請求)
A: create pvp → B: join {code} → 雙方 submit → GET state
📋 預期輸出
房號 6 碼;雙方分數與 winner 判定
➡️ 實際輸出結果
房號 YYELCX ✓ 加入 ✓ 雙方交卷 ✓ 結果:QA測試學生 183 vs QA測試好友 380,winner_id=18
不能加入自己的房間 13962ms

🎯 測試目的(依操作說明):對戰防呆驗證

⬅️ 輸入(實際請求)
建房者自己 join 同房號
📋 預期輸出
HTTP 400
➡️ 實際輸出結果
HTTP 400 ✓「不能加入自己開的房間啦!把房號傳給朋友吧 😄」
我的戰績與對戰歷史 29ms

🎯 測試目的(依操作說明):說明「對戰 → 週排行榜 & 戰績」

⬅️ 輸入(實際請求)
GET /api/battle/history
📋 預期輸出
含剛完成的對戰紀錄
➡️ 實際輸出結果
對戰歷史 2 筆 ✓,最新一場:pvp 得分 183,答對 1/5

🌟 社群互動 & 🤝 合作公益 3/3 通過

課程許願 + 投票 31ms

🎯 測試目的(依操作說明):說明「社群 → 許願池」:許願 → 別人投票

⬅️ 輸入(實際請求)
POST /api/wishes {title} → POST /api/wishes/:id/vote
📋 預期輸出
願望建立;票數 +1
➡️ 實際輸出結果
願望 id=7 建立 ✓ 投票後票數=1 ✓
小額捐款 14ms

🎯 測試目的(依操作說明):說明「合作公益 → 小額捐款」:金額+留言

⬅️ 輸入(實際請求)
POST /api/donations {donor_name, amount:100, message}
📋 預期輸出
捐款成功 + 感謝訊息
➡️ 實際輸出結果
感謝您的愛心!捐款收據將寄至您的Email,100%用於偏鄉英語教育。
捐款金額驗證 11ms

🎯 測試目的(依操作說明):輸入驗證:金額必須 > 0

⬅️ 輸入(實際請求)
POST /api/donations {amount:0}
📋 預期輸出
HTTP 400
➡️ 實際輸出結果
HTTP 400 ✓「請輸入捐款金額」

🧹 測試資料清理 1/1 通過

學生退出班級 → 老師刪除作業與班級 50ms

🎯 測試目的(依操作說明):還原測試環境,避免殘留資料

⬅️ 輸入(實際請求)
DELETE /api/class/:id/leave、/api/teacher/assignments/:aid、/api/teacher/classes/:id
📋 預期輸出
全部刪除成功
➡️ 實際輸出結果
退班 ✓ 刪作業 ✓ 刪班級 ✓(QA 帳號保留供追溯)