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

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

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

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

頁面 /(首頁) 135ms

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

🎯 測試目的(依操作說明):學習專區「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 9ms

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

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

📡 公開 API 8/8 通過

平台即時統計 23ms

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

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

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

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

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

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

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

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

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

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

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

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

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

⬅️ 輸入(實際請求)
GET /api/battle/leaderboard
📋 預期輸出
HTTP 200 + 榜單
➡️ 實際輸出結果
{"top":[{"user_id":23,"display_name":"QA測試學生","avatar_emoji":"🦊","total_score":768,"games":2,"wins":0},{"user_id":19,"display_name":"QA測試學生","avatar_emoji":"🤓","total_score":668,"games":2,"wins":0},{"user_id":26,"display_name":"QA測試學生","avatar_emoji":"🙂","total_score":468,"games":2,"wins":0},{"us …(截斷)
未登入保護:上傳影音應被擋 18ms

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

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

👤 會員系統 14/14 通過

OTP 完整註冊流程(學生) 187ms

🎯 測試目的(依操作說明):說明「會員系統 → 註冊」:Email 驗證碼 → 手機簡訊驗證碼 → 填居住地/學區 → 註冊成功自動登入

⬅️ 輸入(實際請求)
send-code(email) → verify-code → send-code(sms) → verify-code → POST /api/auth/register {email:qa_stu_bnjste@test.tupalish.com, phone, city:臺北市, district:大安區, school_district}
📋 預期輸出
OTP 雙驗證通過 + 註冊成功 + Session Cookie
➡️ 實際輸出結果
歡迎加入 Tupalish,QA測試學生!🍊(Email+簡訊雙驗證 ✓,手機 0948399907,已取得 Cookie)
未驗證直接註冊應被擋 11ms

🎯 測試目的(依操作說明):註冊安全:必須先通過 Email + 簡訊 OTP 驗證

⬅️ 輸入(實際請求)
POST /api/auth/register(未先 verify-code)
📋 預期輸出
HTTP 400 + 提示先完成驗證
➡️ 實際輸出結果
HTTP 400 ✓「請先完成 Email 驗證」
缺少手機/居住地/學區應被擋 8ms

🎯 測試目的(依操作說明):註冊驗證:新必填欄位

⬅️ 輸入(實際請求)
POST /api/auth/register(缺 phone)
📋 預期輸出
HTTP 400
➡️ 實際輸出結果
HTTP 400 ✓「請輸入有效的手機號碼(09 開頭 10 碼)」
錯誤驗證碼應被擋 21ms

🎯 測試目的(依操作說明):OTP 安全:驗證碼錯誤回 400 並累計嘗試次數

⬅️ 輸入(實際請求)
POST /api/auth/verify-code(錯誤碼)
📋 預期輸出
HTTP 400
➡️ 實際輸出結果
HTTP 400 ✓「驗證碼錯誤(還可試 4 次)」
60 秒內重發驗證碼應被擋 20ms

🎯 測試目的(依操作說明):OTP 防濫發:冷卻 60 秒

⬅️ 輸入(實際請求)
POST /api/auth/send-code ×2(同目標)
📋 預期輸出
第二次 HTTP 429
➡️ 實際輸出結果
HTTP 429 ✓「請稍候 60 秒後再重新發送」
密碼太短應被擋 6ms

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

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

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

⬅️ 輸入(實際請求)
POST /api/auth/register(同 qa_stu_bnjste@test.tupalish.com)
📋 預期輸出
HTTP 409
➡️ 實際輸出結果
HTTP 409 ✓「這個 Email 已經註冊過了,請直接登入」
重複手機號碼應被擋 10ms

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

⬅️ 輸入(實際請求)
POST /api/auth/register(同學生手機)
📋 預期輸出
HTTP 409
➡️ 實際輸出結果
HTTP 409 ✓「這個手機號碼已經被註冊過了」
登出 11ms

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

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

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

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

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

⬅️ 輸入(實際請求)
GET /api/auth/me
📋 預期輸出
HTTP 200 + user 物件
➡️ 實際輸出結果
{"id":29,"username":"qa_stu_bnjste_ewtp","display_name":"QA測試學生","email":"qa_stu_bnjste@test.tupalish.com","role":"member","avatar_emoji":"😄","points":0}
錯誤密碼應被擋 103ms

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

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

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

⬅️ 輸入(實際請求)
註冊 qa_tea_bnjste@test.tupalish.com 與 qa_frd_bnjste@test.tupalish.com
📋 預期輸出
兩帳號皆註冊成功
➡️ 實際輸出結果
老師 ✓(OTP 雙驗證)好友 ✓(OTP 雙驗證)
AI 每日額度查詢 21ms

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

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

🎬 Nibbles 短影音 3/3 通過

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

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

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

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

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

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

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

👑 Pro 教學專區 8/8 通過

角色切換器 Demo 35ms

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

⬅️ 輸入(實際請求)
POST /api/pro/demo-role {role:"pro"}
📋 預期輸出
HTTP 200,tier 查詢變 pro
➡️ 實際輸出結果
demo_role=pro 生效,tier 查詢回傳 pro ✓
定價方案清單 12ms

🎯 測試目的(依操作說明):說明「定價 → 方案」:個人/校園/補教/廠商四類方案

⬅️ 輸入(實際請求)
GET /api/pricing
📋 預期輸出
HTTP 200 + 10 個方案(含 Pro 699/1999/6999)
➡️ 實際輸出結果
共 10 個方案 ✓ Pro 月繳 NT$699 ✓
綠界金流:建立訂單取得付款表單 20ms

🎯 測試目的(依操作說明):說明「定價 → 升級 Pro」:選方案 → 產生綠界 AioCheckOut 表單(信用卡定期定額)

⬅️ 輸入(實際請求)
POST /api/pay/checkout {plan_code:"pro_monthly"}(登入)
📋 預期輸出
HTTP 200 + action + fields(CheckMacValue/PeriodAmount)
➡️ 實際輸出結果
訂單 TPMSOCIU019AZ9ZR ✓ 導向綠界測試環境,CheckMacValue ✓ 定期定額(月扣 699)✓
B2B 議價方案不可線上刷卡 16ms

🎯 測試目的(依操作說明):校園/補教授權金採議價,提示來信洽談

⬅️ 輸入(實際請求)
POST /api/pay/checkout {plan_code:"school_license"}
📋 預期輸出
HTTP 400 + contact:true
➡️ 實際輸出結果
HTTP 400 ✓「此方案為 B2B 授權議價方案,請來信 hello@tupalish.com 洽談」
後台手動開通訂單 → 會員升級 Pro 170ms

🎯 測試目的(依操作說明):說明「後台 → 定價/訂單 → 手動開通」:B2B 或客服開通,tier 即時生效

⬅️ 輸入(實際請求)
POST /api/admin/orders/:id/mark-paid(管理員)
📋 預期輸出
訂單 paid + 會員 tier=pro + 效期
➡️ 實際輸出結果
訂單 TPMSOCIU019AZ9ZR 開通 ✓ tier=pro,效期至 2026-09-11 ✓
課程詳情(課綱+單元) 21ms

🎯 測試目的(依操作說明):說明「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" …(截斷)
預約直播 48ms

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

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

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

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

🤖 AI 學習工具 5/5 通過

寓言故事生成 16440ms

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

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

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

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

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

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

💡 過去式要用不規則動詞:go → went;meet → met。也可以說 "I saw my friend" 做替換。
中翻英 — AI 出題 4857ms

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

⬅️ 輸入(實際請求)
POST /api/ai/translate-question {level:"easy"}
📋 預期輸出
JSON: chinese + hint
➡️ 實際輸出結果
出題:「我每天坐公車上學,大約需要三十分鐘。」hint: bus / go to school / about 30 minutes
中翻英 — AI 批改 8959ms

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

⬅️ 輸入(實際請求)
POST /api/ai/translate {chinese:"我每天走路上學。", answer:"I walk to school every day."}
📋 預期輸出
JSON: score/feedback/better
➡️ 實際輸出結果
score=100,feedback: 非常好!你的翻譯完全正確且自然。句子用簡單現在式表達習慣動作(I walk to school every day.)很恰當,語序和用詞(walk to school、every day)都是地道的英語。small note:頻率副詞 every day 放在句末或句首都可以(例如:Every da …(截斷)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

📝 AI 作文專區 9/9 通過

AI 智慧出題 9849ms

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

⬅️ 輸入(實際請求)
POST /api/study/sentence {word:"improve", sentence:"I want to improve my English skill everyday."}
📋 預期輸出
JSON: correct/feedback/better
➡️ 實際輸出結果
correct=false,feedback: 注意 'English skill' 建議改成複數 'English skills' 或直接說 'my English';表示「每天」要寫成兩個字 'every day',而不是形容詞 'everyday'。

⚔️ 英霸對戰 4/4 通過

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

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

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

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

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

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

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

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

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

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

課程許願 + 投票 32ms

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

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

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

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

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

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

🛡️ 商轉後台管理 12/12 通過

未登入打後台 API 應 403 11ms

🎯 測試目的(依操作說明):後台安全:所有 /api/admin/* 需管理員身分

⬅️ 輸入(實際請求)
GET /api/admin/overview(無 Cookie)
📋 預期輸出
HTTP 403
➡️ 實際輸出結果
HTTP 403 ✓「僅限管理員(需以小編/教師帳號登入)」
一般會員打後台 API 應 403 12ms

🎯 測試目的(依操作說明):後台安全:member 角色不可進後台

⬅️ 輸入(實際請求)
GET /api/admin/overview(學生 Cookie)
📋 預期輸出
HTTP 403
➡️ 實際輸出結果
HTTP 403 ✓ 一般會員被正確阻擋
demo 切 admin 不可提權 43ms

🎯 測試目的(依操作說明):商轉安全:一般會員用角色切換器切 admin 應無效

⬅️ 輸入(實際請求)
POST /api/pro/demo-role {role:"admin"} → GET /api/ai/quota
📋 預期輸出
tier 仍為 free(非 admin)
➡️ 實際輸出結果
demo admin 無效,tier=free ✓(已還原)
教師(管理員)看營運總覽 40ms

🎯 測試目的(依操作說明):說明「後台 → 營運總覽」:會員/影片/AI 成本 KPI

⬅️ 輸入(實際請求)
GET /api/admin/overview(教師 Cookie)
📋 預期輸出
HTTP 200 + users/videos/aiCostMonth 等欄位
➡️ 實際輸出結果
會員 31 人、影片 22 部(待審 2)、本月 AI $0.3314 ✓
教師開啟 /admin 頁;學生被導回首頁 40ms

🎯 測試目的(依操作說明):後台頁伺服器端守門

⬅️ 輸入(實際請求)
GET /admin(教師=後台頁;學生=302 導回首頁)
📋 預期輸出
教師看到後台;學生看不到後台內容
➡️ 實際輸出結果
教師見後台 ✓ 學生被導回(頁面不含後台)✓
會員管理:搜尋與清單 21ms

🎯 測試目的(依操作說明):說明「後台 → 會員管理」:搜尋姓名/Email、分頁

⬅️ 輸入(實際請求)
GET /api/admin/users?q=QA
📋 預期輸出
HTTP 200 + list + total
➡️ 實際輸出結果
搜尋「QA」共 21 位 ✓
後台修訂方案價格 99ms

🎯 測試目的(依操作說明):說明「後台 → 定價/訂單 → 編輯」:管理者修訂價格,前台即時生效

⬅️ 輸入(實際請求)
PUT /api/admin/pricing/:id {price:799} → 驗證 → 還原 699
📋 預期輸出
更新成功 + 公開 API 價格同步 + 稽核留痕
➡️ 實際輸出結果
699 → 799 ✓ 前台同步 ✓ 還原 699 ✓(稽核日誌留痕)
內容審核:通過本次上傳影片 23ms

🎯 測試目的(依操作說明):說明「後台 → 內容審核」:pending → approved

⬅️ 輸入(實際請求)
POST /api/admin/videos/${id}/approve
📋 預期輸出
HTTP 200 + 通過訊息
➡️ 實際輸出結果
✅ 已通過「QA自動測試影音 bnjste」
停權會員 → 登入被擋 → 復權 269ms

🎯 測試目的(依操作說明):說明「後台 → 會員管理 → 停權」:停權即強制登出且無法再登入

⬅️ 輸入(實際請求)
POST /api/admin/users/:id/suspend → 登入(403)→ restore → 登入(200)
📋 預期輸出
停權後登入 403;復權後登入 200
➡️ 實際輸出結果
停權 ✓ → 登入 403 ✓ → 復權 ✓ → 登入 200 ✓
公告管理:發布與刪除 50ms

🎯 測試目的(依操作說明):說明「後台 → 許願/公告」:發布公告(社群頁即時可見)→ 刪除

⬅️ 輸入(實際請求)
POST /api/admin/announcements → DELETE
📋 預期輸出
發布 200 + 刪除 200
➡️ 實際輸出結果
發布 id=9 ✓ 刪除 ✓
稽核日誌完整記錄 19ms

🎯 測試目的(依操作說明):說明「後台 → 稽核日誌」:每個管理操作都留痕

⬅️ 輸入(實際請求)
GET /api/admin/logs
📋 預期輸出
含本次 approve/suspend/restore/公告 紀錄
➡️ 實際輸出結果
共 32 筆,近期動作:announce_delete, announce_create, user_restore, user_suspend, video_approve, pricing_update ✓
管理員不可停權自己 27ms

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

⬅️ 輸入(實際請求)
POST /api/admin/users/(自己id)/suspend
📋 預期輸出
HTTP 400
➡️ 實際輸出結果
HTTP 400 ✓「不可停權自己」

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

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

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

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