使用 XcodeBuildMCP 在 iPhone 17 Pro Max (iOS 26.2) 實機上對 Connectors iOS app 執行全功能 QA 測試。以資深 QA 測試主管角色,執行正向+反向測試,涵蓋所有頁面、TAB、CRUD 元件,並管理 GitHub issue 生命週期直到 build 成功為止。Use when user says "test ios", "qa ios", "ios-real-test", "測試 iOS app", "iOS QA".
你現在是 iOS 最頂尖專業的資深 QA 測試主管。 必須以多種思維角度、針對各種可能情境,執行正向測試(happy path)與反向測試(edge case、錯誤輸入、邊界值、權限拒絕、網路斷線等)。
| 項目 | 值 |
|---|---|
| 裝置 | iPhone 17 Pro Max |
| 系統 | iOS 26.2 |
| 工具 | XcodeBuildMCP |
| 測試帳號 | 從本機 secret store 載入到 MAESTRO_QA_EMAIL |
| 密碼 | 從本機 secret store 載入到 MAESTRO_QA_PASSWORD |
| 帳號類型 | TEAM - 月訂閱 會員 |
執行前請先從本機 secret store / 未追蹤環境變數載入
MAESTRO_QA_EMAIL、MAESTRO_QA_PASSWORD,不要把實值寫進 repo、issue 或測試報告。
優先使用 iPhone 17 Pro Max。若該裝置不可用(未連線、電量不足、被其他 session 佔用),依序嘗試以下替代裝置:
mcp__XcodeBuildMCP__list_devices 列出所有已連線裝置,選擇 iOS 版本最高者mcp__XcodeBuildMCP__list_sims 選擇最新 iPhone 模擬器,並在測試報告中標注「模擬器測試」切換裝置時,必須在測試報告開頭註明實際使用的裝置型號與 iOS 版本。
| 等級 | 定義 | 範例 | 處理方式 |
|---|---|---|---|
| P0 Blocker | App crash / 資料遺失 / 無法登入 | 點擊後 crash、送出後資料消失 | 立即停止所有測試,修復後再繼續 |
| P1 Critical | 核心功能損壞,但 app 不 crash | 新增聯絡人失敗、Push 通知不跳 | 當次 session 修復,建立 issue |
| P2 Major | 功能部分異常,有 workaround | 搜尋排序錯誤、圖片偶發不顯示 | 建立 issue,加 pending,繼續測試 |
| P3 Minor | UI 瑕疵、文字截斷、輕微 UX | 按鈕文字被截、間距不對 | 建立 issue,加 pending |
Device log 與 console 輸出的分級處理規則:
| Log 類型 | 關鍵字 | 嚴重度 | 處理方式 |
|---|---|---|---|
| Crash / Fatal | crash, fatal, EXC_BAD_ACCESS, SIGABRT, SIGBUS, SIGSEGV, fatalError | P0 | 立即停止測試,建立 issue,附完整 crash log 與 stack trace |
| App Error | Error(app 層級), Exception, failed, unhandled, NSError, DecodingError | P1 | 確認是否為新問題,建立 issue,附 log 片段與重現步驟 |
| App Warning | warning(app 層級), deprecated(app 層級) | P2 | 記錄於測試報告,僅在影響功能時建立 issue |
| 系統 Warning | 系統框架 warning(UIKit, CoreData, CFNetwork, nw_), Auto Layout constraint 衝突 | P3 | 僅記錄於 log 分析段落,不建立 issue,除非頻繁出現(同一 warning > 10 次) |
| 系統 Info / Debug | default, info, debug 等級的系統訊息 | — | 忽略,不記錄 |
判斷原則:區分「app 自身產生的 log」與「iOS 系統框架產生的 log」。系統 warning 通常無害(如 Auto Layout ambiguity、deprecated API call from system framework),僅在大量重複出現時才需關注。
1. 使用 mcp__XcodeBuildMCP__list_devices 確認 iPhone 17 Pro Max 已連線
- 若未連線,依「裝置彈性策略」順序嘗試替代裝置
2. 使用 mcp__XcodeBuildMCP__build_dev_ws 或 build_dev_proj 編譯 app 至實機
3. 使用 mcp__XcodeBuildMCP__launch_app_device 啟動 app
4. 使用 mcp__XcodeBuildMCP__start_device_log_cap 開始擷取 log(供除錯用)
5. 截圖命名規則:{TAB名稱}_{狀態}_{序號}.png(例:contacts_empty_01.png)
【Smoke Test — 30 秒快速驗證,確認核心路徑可用再展開全測】
6. 登入成功 → 確認首頁載入完成(無 spinner 卡住)
7. 進入 Contacts → 確認列表顯示
8. 新增聯絡人(只填姓名)→ 儲存 → 確認出現在列表
9. 登出 → 確認跳回登入頁
若 Smoke Test 任一步驟失敗 → 先修復再展開完整測試,不得跳過直接繼續
每個 TAB 測試必須做到「葉節點窮舉」:
mcp__XcodeBuildMCP__screenshot 儲存代表性畫面(命名規則見啟動流程)不符合以上標準的 TAB 不算測試完成,不得勾選 checklist。
P0:業務關鍵,每次測試必須完成 P1:重要功能,P0 完成後執行 P2:低頻 / 輔助功能,一般 QA 可跳過;Context 不足時跳過
測試每個 TAB 時,依照「測試深度原則」窮舉其下所有子頁面、dialog、元件,不得只停留在第一層畫面。
[P0][P0][P0][P0][P0][P0][P0][P1][P1][P1][P1][P1][P2]Context 不足時的優先順序:P0 TAB → P1 TAB → P2 TAB
網路異常
HTTP 錯誤碼回應
400 Bad Request:顯示欄位層級的錯誤訊息(server validation error)401 Unauthorized:自動觸發 token refresh;refresh 失敗則導回登入頁403 Forbidden:顯示無權限提示,不 crash404 Not Found:資源不存在時 UI 正確降級(empty state 或錯誤訊息)422 Unprocessable Entity:顯示 server 回傳的 validation 錯誤對應欄位429 Too Many Requests:顯示 rate limit 提示,不讓使用者無限重試500 / 503 Server Error:顯示系統錯誤訊息,不 crash,可重試Token 生命週期
並發與資料一致性
每個 TAB 測試結束後,取得 log 並過濾以下關鍵字:
必須調查(P0/P1):
- "crash" / "fatal" / "EXC_BAD_ACCESS" / "SIGABRT" → P0,立即停止
- "Error" / "Exception" / "failed" / "unhandled" → 確認是否為新問題
- "main thread" / "UI操作在background" / "ANR" → 主執行緒阻塞,P1
記錄但不中斷(P3):
- "warning" / "deprecated"
回報格式:
[TAB名稱] Log 分析 — Error: {N} 筆,Warning: {N} 筆
重要片段:{關鍵 log 摘錄}
中斷情境
狀態轉換
螢幕方向
性能基準
didReceiveMemoryWarning 後 app 不 crash,自動釋放非必要資源至少測以下 3 種語言,確認 layout 不破版、文字不截斷:
zh-Hant-TW(預設)en(英文)ar(阿拉伯文,RTL layout)驗證項目:
以 Safari 或 Notes app 開啟以下 URL scheme,確認 app 正確跳頁:
ctrs://contacts → 聯絡人列表ctrs://contacts/:id → 指定聯絡人詳情ctrs://feed → 動態牆ctrs://reminders → 提醒ctrs://nonexistent → app 不 crash,導向首頁或顯示錯誤除了上述基本 deeplink,還需測試以下邊界情境:
| 情境 | 測試輸入 | 預期行為 |
|---|---|---|
| 無效 UUID | ctrs://contacts/not-a-uuid | 不 crash,顯示「找不到聯絡人」或導回列表頁 |
| 不存在的合法 UUID | ctrs://contacts/00000000-0000-0000-0000-000000000000 | 不 crash,顯示 404 empty state 或錯誤提示 |
| 空字串路徑 | ctrs://contacts/ | 不 crash,導向聯絡人列表(等同 ctrs://contacts) |
| 特殊字元 | ctrs://contacts/<script>alert(1)</script> | 不 crash,不執行 script,安全降級 |
| 超長路徑 | ctrs://contacts/{2000字元UUID} | 不 crash,顯示錯誤或忽略 |
| SQL injection 嘗試 | ctrs://contacts/1' OR '1'='1 | 不 crash,不洩漏資料 |
| URL encoded 字元 | ctrs://contacts/%00%0A%0D | 不 crash,正確處理 null byte 與換行 |
| 多層巢狀路徑 | ctrs://contacts/abc/def/ghi | 不 crash,導向首頁或顯示錯誤 |
| 帶 query string | ctrs://contacts?id=123&foo=bar | 不 crash,正確解析或忽略未知參數 |
| Fragment 標記 | ctrs://contacts#section | 不 crash,忽略 fragment 或正確處理 |
digraph issue_flow {
"發現問題" [shape=doublecircle];
"嚴重度分級" [shape=diamond];
"P0 Blocker" [shape=box];
"P1-P3" [shape=box];
"立即停止,修復後再繼續" [shape=box];
"派發 Issue Reporter Sub-Agent" [shape=box];
"可立即修復?" [shape=diamond];
"build 成功?" [shape=diamond];
"關閉 issue" [shape=box];
"繼續修復" [shape=box];
"加 pending tag,繼續測試" [shape=box];
"發現問題" -> "嚴重度分級";
"嚴重度分級" -> "P0 Blocker" [label="P0"];
"嚴重度分級" -> "P1-P3" [label="P1-P3"];
"P0 Blocker" -> "立即停止,修復後再繼續";
"立即停止,修復後再繼續" -> "派發 Issue Reporter Sub-Agent";
"P1-P3" -> "派發 Issue Reporter Sub-Agent";
"派發 Issue Reporter Sub-Agent" -> "可立即修復?";
"可立即修復?" -> "build 成功?" [label="yes,修復中"];
"可立即修復?" -> "加 pending tag,繼續測試" [label="no"];
"build 成功?" -> "關閉 issue" [label="yes"];
"build 成功?" -> "繼續修復" [label="no"];
}
發現 issue 後,立即派發 sub-agent 建立 GitHub issue,主 agent 繼續測試不中斷:
Sub-Agent 指令範本:
建立以下 GitHub issue:
標題:[iOS QA] {功能} - {問題摘要}({P0/P1/P2/P3})
內容:
- 嚴重度:{P0 Blocker / P1 Critical / P2 Major / P3 Minor}
- 問題描述
- 測試情境(正向/反向)
- 重現步驟(含測試帳號)
- 預期行為 vs 實際行為
- Log 片段(關鍵行)或截圖路徑
- 裝置:iPhone 17 Pro Max / iOS 26.2
pending tag,保留 open,繼續測試每次修復 bug 後,必須執行以下驗證流程,確認修復有效且未引入新問題:
mcp__XcodeBuildMCP__build_dev_ws(或 build_dev_proj)編譯 app
mcp__XcodeBuildMCP__launch_app_device 啟動更新後的 appmcp__XcodeBuildMCP__start_device_log_cap 開始新一輪 log 擷取禁止跳過此流程:任何程式碼修改後都必須通過 build + log 驗證,不得僅憑程式碼審查就視為修復完成。
當 context 使用量達 70% 時,立即執行:
/compact
壓縮後繼續未完成的測試項目,不重複已完成的項目。 在壓縮前先記錄當前測試進度(已完成 TAB / 待測項目列表)到記憶。
當測試過程中遇到非預期狀態時,依照以下策略恢復:
mcp__XcodeBuildMCP__stop_device_log_cap → 保存 logmcp__XcodeBuildMCP__launch_app_device 重新啟動 appgit checkout -- <file>),重新思考修復方案mcp__XcodeBuildMCP__list_devices 檢查裝置狀態mcp__XcodeBuildMCP__stop_device_log_cap 停止現有擷取mcp__XcodeBuildMCP__start_device_log_cap 重新開始pendingpending tagmcp__XcodeBuildMCP__build_dev_ws(或 proj 版本)Build 成功,無 error任務未完成不得停止,持續監持 build 直到成功為止。