# HR 基礎資料維護系統 - 測試設計文件 (TDD) **文件版本**:1.1 **建立日期**:2024-12-06 **最後更新**:2025-12-08 **文件狀態**:Draft --- ## 1. 文件概述 ### 1.1 目的 本文件為 HR 基礎資料維護系統之測試設計文件 (Test Design Document),描述測試策略、測試範圍、測試案例設計與驗收標準,供測試人員與開發人員參考。 ### 1.2 範圍 本測試涵蓋以下功能模組: | 模組 | 測試重點 | |------|----------| | 崗位基礎資料 | CRUD 操作、欄位驗證、資料聯動 | | 職務基礎資料 | CRUD 操作、類別關聯、Toggle 控件 | | 部門職責 | CRUD 操作、組織層級聯動 | | 崗位描述 | CRUD 操作、版本控制 | | AI 幫我想 | LLM 呼叫、JSON 解析、Prompt 編輯、結果填入 | | 崗位清單 | 列表顯示、搜尋過濾、資料匯出 | | 組織階層 | 事業體/處級/部級單位、級聯選擇、API 查詢 | | CSV 匯入匯出 | 批次匯入、範本下載、資料驗證 | ### 1.3 參考文件 - 軟體設計文件 (SDD.md) - API 設計規範 - 需求確認文件 --- ## 2. 測試策略 ### 2.1 測試層次 ``` ┌─────────────────────────────────────────────────────────┐ │ E2E 測試 (End-to-End) │ │ ┌─────────────────────────────────────────────────┐ │ │ │ 整合測試 (Integration) │ │ │ │ ┌─────────────────────────────────────────┐ │ │ │ │ │ 單元測試 (Unit) │ │ │ │ │ │ ┌─────────────────────────────────┐ │ │ │ │ │ │ │ 函數 / API / 元件 │ │ │ │ │ │ │ └─────────────────────────────────┘ │ │ │ │ │ └─────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────┘ ``` ### 2.2 測試類型 | 類型 | 說明 | 工具 | |------|------|------| | 單元測試 | 測試單一函數或模組 | Jest / pytest | | 整合測試 | 測試模組間互動 | pytest | | API 測試 | 測試 RESTful API | Postman / pytest | | UI 測試 | 測試使用者介面 | 手動測試 / Selenium | | 效能測試 | 測試系統效能 | Apache JMeter | ### 2.3 測試環境 | 環境 | 配置 | |------|------| | 前端 | Chrome/Firefox/Edge 最新版 | | 後端 | Python 3.9+, Flask 2.0+ | | LLM | Ollama localhost:11434 | | 資料庫 | In-Memory (測試環境) | --- ## 3. 功能測試案例 ### 3.1 崗位基礎資料模組 #### 3.1.1 新增崗位 | TC-ID | TC-POS-001 | |-------|------------| | 測試名稱 | 新增崗位 - 正常流程 | | 前置條件 | 系統已啟動,用戶在崗位基礎資料頁面 | | 測試步驟 | 1. 輸入崗位編號 "ENG-001"
2. 輸入崗位名稱 "資深軟體工程師"
3. 選擇崗位類別 "技術職"
4. 點擊「保存」按鈕 | | 預期結果 | 顯示「保存成功」Toast,資料寫入成功 | | 實際結果 | | | 通過/失敗 | | | TC-ID | TC-POS-002 | |-------|------------| | 測試名稱 | 新增崗位 - 必填欄位驗證 | | 前置條件 | 系統已啟動,用戶在崗位基礎資料頁面 | | 測試步驟 | 1. 不輸入崗位編號
2. 不輸入崗位名稱
3. 點擊「保存」按鈕 | | 預期結果 | 顯示錯誤訊息「請填寫必填欄位」 | | 實際結果 | | | 通過/失敗 | | | TC-ID | TC-POS-003 | |-------|------------| | 測試名稱 | 新增崗位 - 編號重複檢查 | | 前置條件 | 已存在編號 "ENG-001" 的崗位 | | 測試步驟 | 1. 輸入崗位編號 "ENG-001"
2. 輸入其他欄位
3. 點擊「保存」按鈕 | | 預期結果 | 顯示錯誤訊息「崗位編號已存在」 | | 實際結果 | | | 通過/失敗 | | #### 3.1.2 編輯崗位 | TC-ID | TC-POS-004 | |-------|------------| | 測試名稱 | 編輯崗位 - 正常流程 | | 前置條件 | 已存在崗位 "ENG-001" | | 測試步驟 | 1. 瀏覽至崗位 "ENG-001"
2. 修改崗位名稱為 "高級軟體工程師"
3. 點擊「保存」按鈕 | | 預期結果 | 顯示「更新成功」Toast,資料已更新 | | 實際結果 | | | 通過/失敗 | | #### 3.1.3 刪除崗位 | TC-ID | TC-POS-005 | |-------|------------| | 測試名稱 | 刪除崗位 - 正常流程 | | 前置條件 | 已存在崗位 "ENG-001" | | 測試步驟 | 1. 瀏覽至崗位 "ENG-001"
2. 點擊「刪除」按鈕
3. 確認刪除 | | 預期結果 | 顯示「刪除成功」Toast,資料已移除 | | 實際結果 | | | 通過/失敗 | | ### 3.2 職務基礎資料模組 | TC-ID | TC-JOB-001 | |-------|------------| | 測試名稱 | 新增職務 - 正常流程 | | 前置條件 | 系統已啟動,用戶在職務基礎資料頁面 | | 測試步驟 | 1. 選擇職務類別 "技術職"
2. 輸入職務編號 "TECH-001"
3. 輸入職務名稱 "軟體工程師"
4. 點擊「保存」按鈕 | | 預期結果 | 顯示「保存成功」Toast | | 實際結果 | | | 通過/失敗 | | | TC-ID | TC-JOB-002 | |-------|------------| | 測試名稱 | Toggle 開關功能 | | 前置條件 | 系統已啟動,用戶在職務基礎資料頁面 | | 測試步驟 | 1. 開啟「是否有全勤獎金」Toggle
2. 開啟「是否住房補貼」Toggle
3. 保存資料 | | 預期結果 | Toggle 狀態正確保存,重新載入後狀態一致 | | 實際結果 | | | 通過/失敗 | | ### 3.3 部門職責模組 | TC-ID | TC-DF-001 | |-------|------------| | 測試名稱 | 新增部門職責 - 正常流程 | | 前置條件 | 系統已啟動,用戶在部門職責頁面 | | 測試步驟 | 1. 輸入職責編號 "DF-001"
2. 輸入職責名稱 "研發部門職責"
3. 選擇事業體、處級單位、部級單位
4. 輸入核心職責
5. 點擊「保存」按鈕 | | 預期結果 | 顯示「保存成功」Toast | | 實際結果 | | | 通過/失敗 | | | TC-ID | TC-DF-002 | |-------|------------| | 測試名稱 | 組織層級聯動 | | 前置條件 | 系統已啟動 | | 測試步驟 | 1. 選擇事業體 "SBU"
2. 觀察處級單位選項變化
3. 選擇處級單位
4. 觀察部級單位選項變化 | | 預期結果 | 各層級選項正確聯動,無無效選項 | | 實際結果 | | | 通過/失敗 | | ### 3.4 AI 幫我想功能 > **說明**:v1.1 版本將三個錦囊按鈕整合為單一「AI 幫我想」按鈕,並提供可編輯的 Prompt 編輯器。 | TC-ID | TC-AI-001 | |-------|------------| | 測試名稱 | AI 幫我想 - 正常流程 | | 前置條件 | Ollama 服務已啟動,用戶在崗位基礎資料頁面 | | 測試步驟 | 1. 查看預設 Prompt 內容
2. 點擊「AI 幫我想」按鈕
3. 等待 AI 生成完成 | | 預期結果 | AI 生成資料並填充至表單空白欄位,顯示「AI 生成完成!已填入表單」Toast | | 實際結果 | | | 通過/失敗 | | | TC-ID | TC-AI-002 | |-------|------------| | 測試名稱 | Prompt 編輯功能 | | 前置條件 | 系統已啟動 | | 測試步驟 | 1. 在 Prompt 編輯器修改內容
2. 點擊「AI 幫我想」按鈕
3. 重新整理頁面
4. 檢查 Prompt 是否保留 | | 預期結果 | 修改的 Prompt 保存至 LocalStorage,重新整理後恢復 | | 實際結果 | | | 通過/失敗 | | | TC-ID | TC-AI-003 | |-------|------------| | 測試名稱 | Prompt 重置功能 | | 前置條件 | 已修改 Prompt 內容 | | 測試步驟 | 1. 修改 Prompt 內容
2. 點擊重置按鈕(↺ 圖示) | | 預期結果 | Prompt 恢復為預設值,顯示「已重置為預設 Prompt」Toast | | 實際結果 | | | 通過/失敗 | | | TC-ID | TC-AI-004 | |-------|------------| | 測試名稱 | 各模組 AI 功能 | | 前置條件 | Ollama 服務已啟動 | | 測試步驟 | 分別在以下模組測試 AI 功能:
1. 崗位基礎資料 (positionBasic)
2. 招聘要求 (positionRecruit)
3. 職務基礎資料 (jobBasic)
4. 部門職責 (deptFunction)
5. 崗位描述 (jobDesc) | | 預期結果 | 各模組 AI 均能正常生成對應欄位資料 | | 實際結果 | | | 通過/失敗 | | | TC-ID | TC-AI-005 | |-------|------------| | 測試名稱 | JSON 解析錯誤處理 | | 前置條件 | LLM 返回非標準 JSON 格式(含思考過程) | | 測試步驟 | 使用 deepseek-reasoner 等推理模型,觀察 JSON 解析 | | 預期結果 | 系統正確從回應中提取 JSON 物件,忽略思考過程文字 | | 實際結果 | | | 通過/失敗 | | | TC-ID | TC-AI-006 | |-------|------------| | 測試名稱 | 按鈕載入狀態 | | 前置條件 | 系統已啟動 | | 測試步驟 | 1. 點擊「AI 幫我想」按鈕
2. 觀察按鈕狀態變化 | | 預期結果 | 按鈕顯示 spinner 和「AI 生成中...」文字,完成後恢復原狀 | | 實際結果 | | | 通過/失敗 | | | TC-ID | TC-AI-007 | |-------|------------| | 測試名稱 | 空白 Prompt 防護 | | 前置條件 | 系統已啟動 | | 測試步驟 | 1. 清空 Prompt 編輯器
2. 點擊「AI 幫我想」按鈕 | | 預期結果 | 顯示錯誤訊息「請輸入 Prompt 指令」 | | 實際結果 | | | 通過/失敗 | | ### 3.5 CSV 匯入匯出 | TC-ID | TC-CSV-001 | |-------|------------| | 測試名稱 | 下載 CSV 範本 | | 前置條件 | 系統已啟動 | | 測試步驟 | 1. 點擊「下載崗位 CSV 範本」按鈕 | | 預期結果 | 瀏覽器下載 CSV 檔案,格式正確 | | 實際結果 | | | 通過/失敗 | | | TC-ID | TC-CSV-002 | |-------|------------| | 測試名稱 | 匯入崗位 CSV | | 前置條件 | 已準備符合格式的 CSV 檔案 | | 測試步驟 | 1. 點擊「匯入崗位」按鈕
2. 選擇 CSV 檔案
3. 確認匯入 | | 預期結果 | 顯示匯入結果,資料正確寫入 | | 實際結果 | | | 通過/失敗 | | | TC-ID | TC-CSV-003 | |-------|------------| | 測試名稱 | 匯入 CSV - 格式錯誤 | | 前置條件 | CSV 檔案格式不正確 | | 測試步驟 | 1. 選擇格式錯誤的 CSV 檔案
2. 嘗試匯入 | | 預期結果 | 顯示錯誤訊息,說明格式問題 | | 實際結果 | | | 通過/失敗 | | ### 3.6 組織階層模組 | TC-ID | TC-ORG-001 | |-------|------------| | 測試名稱 | 事業體列表載入 | | 前置條件 | 組織階層資料已匯入 | | 測試步驟 | 1. 開啟部門職責頁面
2. 查看事業體下拉選單 | | 預期結果 | 顯示所有事業體選項(SBU, PBU, NBU 等) | | 實際結果 | | | 通過/失敗 | | | TC-ID | TC-ORG-002 | |-------|------------| | 測試名稱 | 處級單位級聯選擇 | | 前置條件 | 組織階層資料已匯入 | | 測試步驟 | 1. 選擇事業體 "SBU"
2. 觀察處級單位選項 | | 預期結果 | 處級單位僅顯示屬於 SBU 的選項 | | 實際結果 | | | 通過/失敗 | | | TC-ID | TC-ORG-003 | |-------|------------| | 測試名稱 | 部級單位級聯選擇 | | 前置條件 | 已選擇事業體和處級單位 | | 測試步驟 | 1. 選擇處級單位
2. 觀察部級單位選項 | | 預期結果 | 部級單位僅顯示屬於該處級單位的選項 | | 實際結果 | | | 通過/失敗 | | | TC-ID | TC-ORG-004 | |-------|------------| | 測試名稱 | 崗位名稱級聯選擇 | | 前置條件 | 已選擇部級單位 | | 測試步驟 | 1. 選擇部級單位
2. 觀察崗位名稱選項 | | 預期結果 | 崗位名稱僅顯示屬於該部級單位的選項 | | 實際結果 | | | 通過/失敗 | | --- ## 4. API 測試案例 ### 4.1 崗位 API | TC-ID | 端點 | 方法 | 測試說明 | 預期狀態碼 | |-------|------|------|----------|------------| | TC-API-001 | /api/positions | GET | 查詢所有崗位 | 200 | | TC-API-002 | /api/positions | POST | 新增崗位(正常) | 201 | | TC-API-003 | /api/positions | POST | 新增崗位(缺少必填) | 400 | | TC-API-004 | /api/positions/{id} | GET | 查詢單一崗位 | 200 | | TC-API-005 | /api/positions/{id} | GET | 查詢不存在崗位 | 404 | | TC-API-006 | /api/positions/{id} | PUT | 更新崗位 | 200 | | TC-API-007 | /api/positions/{id} | DELETE | 刪除崗位 | 200 | ### 4.2 職務 API | TC-ID | 端點 | 方法 | 測試說明 | 預期狀態碼 | |-------|------|------|----------|------------| | TC-API-011 | /api/jobs | GET | 查詢所有職務 | 200 | | TC-API-012 | /api/jobs | POST | 新增職務(正常) | 201 | | TC-API-013 | /api/jobs/{id} | PUT | 更新職務 | 200 | | TC-API-014 | /api/jobs/{id} | DELETE | 刪除職務 | 200 | ### 4.3 LLM API | TC-ID | 端點 | 方法 | 測試說明 | 預期狀態碼 | |-------|------|------|----------|------------| | TC-API-021 | /api/llm/generate | POST | LLM 生成(Ollama) | 200 | | TC-API-022 | /api/llm/generate | POST | LLM 生成(無效 API) | 400 | | TC-API-023 | /api/llm/generate | POST | LLM 服務不可用 | 500 | ### 4.4 組織階層 API | TC-ID | 端點 | 方法 | 測試說明 | 預期狀態碼 | |-------|------|------|----------|------------| | TC-API-031 | /api/hierarchy/business-units | GET | 查詢所有事業體 | 200 | | TC-API-032 | /api/hierarchy/divisions | GET | 查詢所有處級單位 | 200 | | TC-API-033 | /api/hierarchy/divisions?business=SBU | GET | 按事業體篩選處級單位 | 200 | | TC-API-034 | /api/hierarchy/departments | GET | 查詢所有部級單位 | 200 | | TC-API-035 | /api/hierarchy/departments?division=技術處 | GET | 按處級篩選部級單位 | 200 | | TC-API-036 | /api/hierarchy/positions | GET | 查詢所有崗位名稱 | 200 | | TC-API-037 | /api/hierarchy/positions?department=研發部 | GET | 按部級篩選崗位 | 200 | | TC-API-038 | /api/hierarchy/full | GET | 查詢完整階層資料 | 200 | | TC-API-039 | /api/hierarchy/full?page=1&size=50 | GET | 分頁查詢階層資料 | 200 | | TC-API-040 | /api/hierarchy/cascade | GET | 查詢級聯選擇資料 | 200 | | TC-API-041 | /api/hierarchy/stats | GET | 查詢組織統計 | 200 | --- ## 5. UI 測試案例 ### 5.1 表單互動 | TC-ID | TC-UI-001 | |-------|------------| | 測試名稱 | 頁籤切換 | | 測試步驟 | 1. 點擊「招聘要求資料」頁籤
2. 點擊「基礎資料」頁籤 | | 預期結果 | 頁籤內容正確切換,動畫流暢 | | TC-ID | TC-UI-002 | |-------|------------| | 測試名稱 | 類別聯動顯示 | | 測試步驟 | 1. 選擇崗位類別 "01"
2. 觀察崗位類別名稱欄位 | | 預期結果 | 自動顯示「技術職」 | | TC-ID | TC-UI-003 | |-------|------------| | 測試名稱 | Toast 通知顯示 | | 測試步驟 | 1. 執行保存操作 | | 預期結果 | 右上角顯示 Toast 通知,3秒後自動消失 | ### 5.2 響應式設計 | TC-ID | TC-UI-010 | |-------|------------| | 測試名稱 | 手機版佈局 | | 測試步驟 | 將瀏覽器寬度調整為 375px | | 預期結果 | 表單變為單欄佈局,按鈕仍可操作 | | TC-ID | TC-UI-011 | |-------|------------| | 測試名稱 | 平板版佈局 | | 測試步驟 | 將瀏覽器寬度調整為 768px | | 預期結果 | 佈局適當調整,無元素重疊 | --- ## 6. 效能測試 ### 6.1 載入效能 | 測試項目 | 目標值 | 測試方法 | |----------|--------|----------| | 首次載入時間 | < 3秒 | Chrome DevTools | | API 回應時間 | < 500ms | Postman | | LLM 生成時間 | < 30秒 | 實際測試 | ### 6.2 並發測試 | 測試項目 | 目標值 | |----------|--------| | 同時連線數 | 50+ | | API 請求/秒 | 100+ | --- ## 7. 安全測試 ### 7.1 輸入驗證 | TC-ID | TC-SEC-001 | |-------|------------| | 測試名稱 | XSS 防護 | | 測試步驟 | 在輸入框輸入 `` | | 預期結果 | 腳本不執行,內容被轉義或過濾 | | TC-ID | TC-SEC-002 | |-------|------------| | 測試名稱 | SQL Injection 防護 | | 測試步驟 | 在輸入框輸入 `'; DROP TABLE positions; --` | | 預期結果 | SQL 不執行,顯示錯誤或過濾 | ### 7.2 API 安全 | TC-ID | TC-SEC-010 | |-------|------------| | 測試名稱 | CORS 設定 | | 測試步驟 | 從不同來源發送 API 請求 | | 預期結果 | 僅允許白名單來源 | --- ## 8. 測試報告模板 ### 8.1 測試摘要 | 項目 | 數值 | |------|------| | 總測試案例數 | | | 通過數 | | | 失敗數 | | | 通過率 | | | 測試日期 | | | 測試人員 | | ### 8.2 缺陷追蹤 | 缺陷ID | 嚴重度 | 標題 | 狀態 | 負責人 | |--------|--------|------|------|--------| | | | | | | --- ## 9. 驗收標準 ### 9.1 功能驗收 - [ ] 所有 CRUD 操作正常運作 - [ ] 三個錦囊 AI 功能可正常生成內容 - [ ] CSV 匯入匯出功能完整 - [ ] 所有必填欄位驗證正確 - [ ] 組織層級聯動正確 ### 9.2 效能驗收 - [ ] 頁面載入時間 < 3秒 - [ ] API 回應時間 < 500ms - [ ] 無明顯 UI 卡頓 ### 9.3 相容性驗收 - [ ] Chrome 最新版正常 - [ ] Firefox 最新版正常 - [ ] Edge 最新版正常 --- ## 10. 版本歷史 | 版本 | 日期 | 作者 | 變更說明 | |------|------|------|----------| | 1.0 | 2024-12-06 | System | 初始版本 | | 1.1 | 2025-12-08 | System | 1. 更新 AI 功能測試案例(三個錦囊 → AI 幫我想)
2. 新增組織階層模組測試案例
3. 新增組織階層 API 測試案例
4. 更新 JSON 解析錯誤處理測試(支援推理模型) | --- **文件結束**