Files
hr-position-system/docs/TDD.md
DonaldFang 方士碩 a6af297623 backup: 完成 HR_position_ 表格前綴重命名與欄位對照表整理
變更內容:
- 所有資料表加上 HR_position_ 前綴
- 整理完整欄位顯示名稱與 ID 對照表
- 模組化 JS 檔案 (admin.js, ai.js, csv.js 等)
- 專案結構優化 (docs/, scripts/, tests/ 等)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-09 12:05:20 +08:00

18 KiB
Raw Permalink Blame History

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 防護
測試步驟 在輸入框輸入 <script>alert('XSS')</script>
預期結果 腳本不執行,內容被轉義或過濾
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 解析錯誤處理測試(支援推理模型)

文件結束