經過昨天的設計階段,MenuBar Todo 的外觀已經成型。今天要進入 AI-DLC Sprint 的第四個關鍵環節 - AI QA Engineer。這次我們聚焦在最核心的品質把關工作:從 User Story 生成精準的驗收標準(Acceptance Criteria)。
先看看我手上這份「快速新增任務」的 User Story。這是 MenuBar Todo 的核心功能,如果這個功能的驗收標準寫不好,整個產品的品質就無法保證。
傳統開發中,驗收標準常常寫得很隨意:
這種 AC 看起來有道理,但實際測試時問題一堆:Enter 鍵要按幾次?空白輸入怎麼處理?焦點要不要保持?任務顯示在哪裡?
讓我展示 AI 如何把我的 User Story US-3.3 轉化為精準的驗收標準。
AI 分析 User Story 後的理解:
核心價值:「快速」是關鍵
- 不需要切換視窗
- 最少的操作步驟
- 立即看到結果
使用情境:工作中斷時的快速記錄
- 正在寫程式,突然想到一件事
- 開會時記錄 action items
- code review 發現的問題
成功指標:
- 從想法到記錄完成 < 3 秒
- 操作步驟 ≤ 3 步
- 零學習成本
我原本的 AC 已經用了 Given-When-Then 格式,但 AI 幫我找出了許多遺漏的細節:
Given 輸入欄位已聚焦
When 我輸入任務內容並按 Enter
Then 應發生以下動作:
- 創建新任務,到期日設為今天
- 任務立即顯示在當前檢視中
- 輸入欄位清空
- 焦點保持在輸入欄位
Given 輸入欄位已聚焦
And 當前檢視為「今日」
And 已有 2 個未完成任務
When 我輸入「修復登入 bug」(10個字元)
And 在 500ms 內按下 Enter 鍵
Then 應依序發生:
1. 輸入欄位立即清空(< 50ms)
2. 新任務出現在列表頂部(< 100ms)
3. 新任務有淡入動畫(200ms)
4. 任務計數從 2 更新為 3
5. 焦點保持在輸入欄位(可立即輸入下一個)
6. 新任務的到期日為今天 23:59:59
7. 自動儲存到本地(< 500ms)
看到差別了嗎?AI 版本不只說「要做什麼」,還定義了「怎樣才算做對」。
原始 Story 只有 4 個條件,AI 幫我補充了更多關鍵場景:
Given 輸入欄位已聚焦
When 我快速連續輸入並提交 3 個任務:
1. 輸入「任務一」+ Enter(耗時 2 秒)
2. 輸入「任務二」+ Enter(耗時 1.5 秒)
3. 輸入「任務三」+ Enter(耗時 1 秒)
Then 應該:
- 3 個任務都成功創建
- 順序正確(任務三在最上)
- 每次 Enter 後焦點都保持
- 沒有重複提交
- 總耗時 < 5 秒
Given 輸入欄位已聚焦
When 我輸入包含特殊字元的任務:
- 「修復 `npm install` 錯誤」(包含反引號)
- 「準備 Q4 < 預算規劃 >」(包含角括號)
- 「完成 50% 的進度」(包含百分號)
- 「處理 [user@email.com](mailto:user@email.com) 的問題」(包含 @)
Then 應該:
- 所有特殊字元正確顯示
- 不觸發意外的格式化
- 儲存和載入後字元不變
- 不產生 XSS 風險
Given 我正在輸入「準備明天的會議資料」
And 已輸入「準備明天」
When 發生以下任一情況:
- 點擊視窗外部
- 按下 ESC 鍵
- 切換到其他應用程式
Then 應該:
- 保留輸入的文字(不清空)
- 下次開啟時文字還在
- 游標位置在文字末端
- 可以繼續編輯
AI 不只強化既有 AC,還主動識別了各種邊界情況:
條件:大量文字輸入
Given 輸入欄位為空
When 我貼上 200 個字元的文字
Then 應該:
- 在 50ms 內顯示完整文字
- 字數計數器即時更新
- 不會卡頓或延遲
- 自動捲動到游標位置
條件:快速操作
Given 輸入欄位已聚焦
When 我在 100ms 內按下 5 次 Enter
Then 應該:
- 只觸發一次提交(防抖)
- 不創建空白任務
- 不產生錯誤
條件:鍵盤導航
Given 使用者使用鍵盤操作
When 按 Tab 鍵導航
Then 應該:
- 輸入欄位可被 Tab 選中
- 有明顯的焦點指示器
- Shift+Tab 可反向導航
- Enter 提交,ESC 取消
條件:螢幕閱讀器
Given 使用者開啟螢幕閱讀器
When 焦點在輸入欄位
Then 應該:
- 朗讀「快速新增任務,編輯文字」
- 輸入時朗讀字元
- 提交後朗讀「任務已新增」
條件:並發創建
Given 兩個 MenuBar 實例同時開啟
When 兩邊同時新增任務
Then 應該:
- 兩個任務都成功儲存
- ID 不會衝突
- 重新載入後都能看到
條件:儲存失敗處理
Given 磁碟空間不足
When 新增任務
Then 應該:
- 顯示錯誤提示
- 任務暫存在記憶體
- 提供重試選項
- 不遺失使用者輸入
AI 最棒的地方是,這些 AC 可以直接轉換成可執行的測試:
基於 AC「輸入驗證」生成:
- test('空白輸入不創建任務')
- test('純空格輸入視為空白')
- test('200字元上限驗證')
- test('特殊字元正確處理')
基於 AC「任務創建」生成:
- test('完整創建流程')
- test('檢視更新同步')
- test('資料持久化驗證')
- test('焦點管理正確')
基於 AC「連續輸入」生成:
- test('使用者快速輸入多個任務')
- test('中斷後繼續輸入')
- test('不同檢視切換')
以下是完整 User Story 的設計以及 AC:
# US-3.3: 快速新增任務
## 基本資訊
- **Story ID**: US-3.3
- **Epic**: Epic 3 - 任務管理
- **Phase**: Phase 1 (MVP)
- **優先級**: P0 (關鍵功能)
- **Story Points**: 2
- **相依性**: US-1.2
## 使用者故事
**身為** 使用者
**我想要** 在彈窗快速新增任務
**以便** 不用開啟主視窗就能記錄待辦事項
## 驗收標準
### 條件 1:輸入介面
- **Given** 彈出視窗已開啟
- **When** 我查看底部區域
- **Then** 我應看到「快速新增任務...」輸入欄位
### 條件 2:任務創建
- **Given** 輸入欄位已聚焦
- **When** 我輸入任務內容並按 Enter
- **Then** 應發生以下動作:
- 創建新任務,到期日設為今天
- 任務立即顯示在當前檢視中
- 輸入欄位清空
- 焦點保持在輸入欄位
### 條件 3:輸入驗證
- **Given** 輸入欄位為空
- **When** 我按下 Enter
- **Then** 不應創建任務,Enter 鍵無作用
### 條件 4:自然語言處理(延展目標)
- **Given** 我在輸入欄位中輸入包含日期的文字
- **When** 按下 Enter
- **Then** 系統應嘗試解析自然語言日期
## 測試案例
### 單元測試
1. 測試 QuickAddInput 元件
2. 測試輸入驗證邏輯
3. 測試日期解析功能
4. 測試表單提交處理
### 整合測試
1. 測試完整的任務創建流程
2. 測試與檢視系統的整合
3. 測試資料持久化
4. 測試錯誤處理
### E2E 測試
1. 測試使用者完整的快速新增體驗
2. 測試不同檢視中的任務顯示
3. 測試連續任務創建
## 設計參考
- 檔案:`/design-spec/wireframes/menubar-popover-wireframe.html` (底部區域)
- 輸入元件規格:
- 高度:36px
- 內距:8px 12px
- 邊框:1px solid, 邊框色
- 圓角:6px
- 字體:14px, -apple-system
- 佔位文字:次要文字色
- Focus 狀態:主色邊框, 0 0 0 3px 主色 20% 光暈
- 底部固定位置,內距 12px
## 完成定義
- [ ] 快速輸入介面正確顯示
- [ ] 任務創建功能正常
- [ ] 輸入驗證正確運作
- [ ] 焦點管理符合預期
- [ ] 任務立即顯示在檢視中
- [ ] 自然語言日期解析(如實作)
- [ ] 單元測試覆蓋率 > 80%
- [ ] 通過設計審查
- [ ] 程式碼審查完成
## 注意事項
- 確保輸入欄位有適當的占位文字
- 實作鍵盤導航支援
- 考慮自動完成或建議功能
- 處理長任務標題的顯示
- 確保與現有任務系統的一致性
AI 幫你把模糊的需求轉成標準的 Given-When-Then 格式。這是基礎,但很有用。
AI 會補充時間要求、數量限制、順序關係等具體指標,讓 AC 真正可測試。
AI 會思考各種使用情境、異常狀況、邊界條件,確保沒有遺漏重要場景。
好的 AC 是產品品質的第一道防線
以前我總覺得 AC 是形式主義,寫了也沒人看。但透過 AI-DLC Sprint,我發現精準的 AC 其實是在定義「什麼叫做完成」。
當你的 AC 寫得夠具體,開發就不會做錯,測試就不會漏測,產品就不會出包。AI 幫助我們把這個「定義完成」的過程變得更系統、更全面、更精準。