專案

一般

配置概況

動作

Task #33

進行中

PID測試腳本-登入

是由 Eric Pan約 2 個月 前加入. 於 約 1 個月 前更新.

狀態:
關閉
優先權:
Low
被分派者:
開始日期:
2025-09-08
完成日期:
完成百分比:

100%

預估工時:
OS版本:
Windows, Linux
網路環境:
內網
現場IP位置:

localhost

硬體設備規格:

DELLPrecision 5820 Tower intel(R)Xeon(R)w-2233 CPU,3.6GHz, RAM:128G Windows 11專業版工作站。x64位元


概述

登入系統測試 TODO 清單

測試環境準備

  • 建立測試資料庫連線
  • 準備測試用戶種子資料
  • 設定測試環境變數(JWT_SECRET_KEY, DATABASE_URL)
  • 初始化 pytest fixtures
  • 準備 httpx AsyncClient 測試客戶端

一、基本登入功能測試

✅ 成功登入場景

  • LOGIN-001: 使用正確的 email 和密碼成功登入
    POST /api/v1/users/login
    {
    "email": "",
    "password": "Test@123456"
    }
    • 驗證 HTTP 狀態碼 = 200
    • 驗證響應包含 access_token
    • 驗證響應包含 token_type = "bearer"
  • LOGIN-002: 使用大小寫混合的 email 成功登入
    {
    "email": "",
    "password": "Test@123456"
    }
    • 驗證 email 大小寫不敏感
  • LOGIN-003: 密碼包含特殊字符成功登入
    {
    "email": "",
    "password": "Test@#$%^&*()123"
    }
  • LOGIN-004: 使用最短有效密碼長度(8字符)成功登入
  • LOGIN-005: 使用最長有效密碼長度(128字符)成功登入

二、登入失敗場景測試

❌ 認證錯誤

  • LOGIN-006: 錯誤密碼登入失敗
    {
    "email": "",
    "password": "WrongPassword123"
    }
    • 驗證 HTTP 狀態碼 = 401
    • 驗證錯誤訊息 = "用戶名或密碼錯誤"
    • 驗證不返回任何 token
  • LOGIN-007: 不存在的 email 登入失敗
    {
    "email": "",
    "password": "AnyPassword123"
    }
    • 驗證 HTTP 狀態碼 = 401
    • 驗證錯誤訊息 = "用戶名或密碼錯誤"(不暴露用戶是否存在)
  • LOGIN-008: 密碼大小寫錯誤登入失敗
    {
    "email": "",
    "password": "test@123456" // 正確是 Test@123456
    }

❌ 帳號狀態問題

  • LOGIN-009: 未啟用帳號(is_active=false)登入失敗
    • 驗證 HTTP 狀態碼 = 400
    • 驗證錯誤訊息 = "用戶未啟用"
  • LOGIN-010: 已刪除帳號(deleted_at 不為 null)登入失敗
    • 驗證 HTTP 狀態碼 = 401
    • 驗證錯誤訊息 = "用戶名或密碼錯誤"
  • LOGIN-011: 帳號被鎖定(如有此功能)登入失敗

三、輸入驗證測試

📝 必填欄位驗證

  • LOGIN-012: 缺少 email 欄位
    {
    "password": "Test@123456"
    }
    • 驗證 HTTP 狀態碼 = 422
    • 驗證錯誤訊息包含 "field required"
  • LOGIN-013: 缺少 password 欄位
    {
    "email": ""
    }
    • 驗證 HTTP 狀態碼 = 422
  • LOGIN-014: 完全空的請求體
    {}
    • 驗證 HTTP 狀態碼 = 422

📝 欄位格式驗證

  • LOGIN-015: 無效的 email 格式
    {
    "email": "not-an-email",
    "password": "Test@123456"
    }
    • 驗證 HTTP 狀態碼 = 422
    • 驗證錯誤訊息包含 email 格式錯誤
  • LOGIN-016: 空白 email
    {
    "email": "",
    "password": "Test@123456"
    }
  • LOGIN-017: 空白密碼
    {
    "email": "",
    "password": ""
    }
  • LOGIN-018: email 包含空格
    {
    "email": " ",
    "password": "Test@123456"
    }
    • 測試是否自動 trim 空格
  • LOGIN-019: null 值作為 email
    {
    "email": null,
    "password": "Test@123456"
    }
  • LOGIN-020: null 值作為 password
    {
    "email": "",
    "password": null
    }

四、JWT Token 測試

🔐 Token 生成驗證

  • LOGIN-021: Token 可以成功解碼
    • 使用 PyJWT 解碼 token
    • 驗證 payload 包含 sub(用戶 ID)
    • 驗證 payload 包含 exp(過期時間)
  • LOGIN-022: Token 包含正確的用戶 ID
    • 解碼 token 獲取 sub
    • 查詢資料庫驗證用戶 ID 正確
  • LOGIN-023: Token 過期時間設定正確
    • 驗證 exp 時間 = 當前時間 + ACCESS_TOKEN_EXPIRE_MINUTES
  • LOGIN-024: Token 使用正確的算法簽名(HS256)

🔐 Token 使用測試

  • LOGIN-025: 使用 Token 成功訪問受保護端點
    GET /api/v1/users/me
    Headers: Authorization: Bearer {token}
    • 驗證成功返回用戶資訊
  • LOGIN-026: 無 Token 訪問受保護端點失敗
    GET /api/v1/users/me
    • 驗證 HTTP 狀態碼 = 401
  • LOGIN-027: 使用過期 Token 訪問失敗
    • 手動創建過期 token
    • 驗證 HTTP 狀態碼 = 401
  • LOGIN-028: 使用偽造 Token 訪問失敗
    • 使用錯誤的 secret key 簽名
    • 驗證 HTTP 狀態碼 = 401
  • LOGIN-029: Token 格式錯誤(缺少 Bearer 前綴)
    Headers: Authorization: {token}
    • 驗證 HTTP 狀態碼 = 401
  • LOGIN-030: Token 格式錯誤(錯誤的前綴)
    Headers: Authorization: Basic {token}

五、安全性測試

🛡️ 注入攻擊防護

  • LOGIN-031: SQL 注入測試 - email 欄位
    {
    "email": "' OR '1'='1",
    "password": "any"
    }
    • 驗證不會繞過認證
    • 驗證返回正常的錯誤訊息
  • LOGIN-032: SQL 注入測試 - password 欄位
    {
    "email": "",
    "password": "' OR '1'='1"
    }
  • LOGIN-033: NoSQL 注入測試(如果使用 MongoDB)
    {
    "email": {"$ne": null},
    "password": {"$ne": null}
    }
  • LOGIN-034: XSS 注入測試
    {
    "email": "<script>alert('xss')</script>@example.com",
    "password": "Test@123456"
    }

🛡️ 暴力破解防護

  • LOGIN-035: 連續失敗登入 5 次
    • 驗證是否有速率限制
    • 驗證是否記錄失敗次數
  • LOGIN-036: 同一 IP 短時間內大量請求
    • 10 秒內發送 100 個請求
    • 驗證是否觸發速率限制
  • LOGIN-037: 不同用戶同時登入測試
    • 並發 10 個不同用戶登入
    • 驗證系統正常處理

🛡️ 密碼安全

  • LOGIN-038: 錯誤密碼不洩漏密碼格式資訊
    • 驗證錯誤訊息不包含「密碼太短」等提示
  • LOGIN-039: 響應時間一致性(防止時序攻擊)
    • 測試存在用戶錯誤密碼的響應時間
    • 測試不存在用戶的響應時間
    • 驗證時間差異 < 100ms

六、邊界條件測試

📊 極端輸入

  • LOGIN-040: 超長 email(255 字符)
  • LOGIN-041: 超長密碼(1000 字符)
  • LOGIN-042: Unicode 字符在 email
    {
    "email": "測試@example.com",
    "password": "Test@123456"
    }
  • LOGIN-043: Emoji 在密碼中
    {
    "email": "",
    "password": "Test😀123456"
    }
  • LOGIN-044: 特殊控制字符測試
    {
    "email": "test\",
    "password": "Test@123456"
    }

七、並發與效能測試

⚡ 並發測試

  • LOGIN-045: 同一用戶並發登入 10 次
    • 驗證所有請求都成功
    • 驗證生成不同的 token
  • LOGIN-046: 100 個不同用戶同時登入
    • 驗證系統穩定性
    • 記錄平均響應時間
  • LOGIN-047: 登入時資料庫連線池測試
    • 模擬連線池滿載情況

⏱️ 效能基準

  • LOGIN-048: 單次登入響應時間 < 500ms
  • LOGIN-049: 1000 次登入平均響應時間 < 1s
  • LOGIN-050: 記憶體使用不超過 100MB

八、錯誤處理測試

⚠️ 系統錯誤

  • LOGIN-051: 資料庫連線失敗時的處理
    • 模擬資料庫斷線
    • 驗證返回 500 錯誤
    • 驗證不洩漏系統資訊
  • LOGIN-052: Redis 快取失敗時的處理(如有使用)
  • LOGIN-053: JWT 密鑰缺失時的處理

⚠️ 請求格式錯誤

  • LOGIN-054: Content-Type 不是 application/json
  • LOGIN-055: 無效的 JSON 格式
    { email: "" } // 缺少引號
  • LOGIN-056: 請求體過大(> 1MB)

九、多因素認證測試(如有實現)

📱 2FA 測試

  • LOGIN-057: 啟用 2FA 的用戶需要驗證碼
  • LOGIN-058: 錯誤的 2FA 驗證碼登入失敗
  • LOGIN-059: 過期的 2FA 驗證碼登入失敗
  • LOGIN-060: 2FA 備用碼測試

十、審計與日誌測試

📝 日誌記錄

  • LOGIN-061: 成功登入記錄到日誌
    • 記錄時間、用戶 ID、IP 地址
  • LOGIN-062: 失敗登入記錄到日誌
    • 記錄失敗原因
  • LOGIN-063: 可疑活動記錄(如 SQL 注入嘗試)
  • LOGIN-064: 日誌不包含敏感資訊(密碼)

測試資料準備

基礎測試用戶

TEST_USERS = [
{
"email": "",
"password": "Active@123456",
"is_active": True,
"role": "USER"
},
{
"email": "",
"password": "Inactive@123456",
"is_active": False,
"role": "USER"
},
{
"email": "",
"password": "Deleted@123456",
"deleted_at": "2024-01-01 00:00:00",
"role": "USER"
}
]

測試執行計畫

執行順序

  1. 環境準備(資料庫、測試資料)
  2. 基本功能(LOGIN-001 ~ LOGIN-005)
  3. 錯誤處理(LOGIN-006 ~ LOGIN-011)
  4. 輸入驗證(LOGIN-012 ~ LOGIN-020)
  5. Token 測試(LOGIN-021 ~ LOGIN-030)
  6. 安全測試(LOGIN-031 ~ LOGIN-039)
  7. 邊界測試(LOGIN-040 ~ LOGIN-044)
  8. 效能測試(LOGIN-045 ~ LOGIN-050)
  9. 系統測試(LOGIN-051 ~ LOGIN-064)

測試指標

  • 功能覆蓋率:100%
  • 程式碼覆蓋率:> 90%
  • 安全測試:全部通過
  • 效能基準:全部達標

是由 Jamie Lin約 2 個月 前更新

  • 狀態需求確認 變更為 設計中
  • 完成百分比0 變更為 30

是由 Jamie Lin約 2 個月 前更新

  • 狀態設計中 變更為 開發中
  • 完成百分比30 變更為 40

是由 Jamie Lin約 2 個月 前更新

  • 狀態開發中 變更為 測試中
  • 完成百分比40 變更為 50

是由 Jamie Lin約 2 個月 前更新

  • 完成百分比50 變更為 90

完整測試已經跑完了,總共花費 2分40秒。

🎯 完整測試結果:

總測試數量: 64 個

  • ✅ 46 個通過
  • ❌ 12 個失敗
  • ⏭️ 6 個跳過

📊 最終指標對比:

指標 目標 實際結果
功能覆蓋率 100% 71.9% (46/64)
程式碼覆蓋率 >90% 未測量
安全測試 全部通過 55.6% (5/9通過)
效能基準 全部達標 60% (3/5通過)

🔍 詳細分析:

  • 基本功能: 良好 (大部分通過)
  • 安全功能: 需改進 (速率限制、時序攻擊防護等未實現)
  • 效能測試: 部分達標 (並發測試失敗)
  • 系統穩定性: 不錯 (連接池正常運作)

結論: 系統基本功能健全,但進階安全和效能功能還需要進一步開發和優化。

● 根據測試結果,12個失敗的項目是:

❌ 12個失敗測試項目:

輸入驗證失敗 (1個):

  • test_login_015_invalid_email_format - 期望422但返回401

JWT Token失敗 (2個):

  • test_login_023_token_expiration_time - Token過期時間驗證
  • test_login_024_token_algorithm_verification - Token算法驗證

安全功能失敗 (4個):

  • test_login_036_rate_limiting_same_ip - 速率限制功能未實現
  • test_login_037_concurrent_different_users - 並發用戶測試
  • test_login_038_password_error_no_info_leak - 密碼錯誤訊息洩漏
  • test_login_039_timing_attack_resistance - 時序攻擊防護

邊界條件失敗 (1個):

  • test_login_044_control_characters - 控制字符處理

並發效能失敗 (2個):

  • test_login_045_same_user_concurrent_login - 同用戶並發登入
  • test_login_046_multiple_users_concurrent_login - 多用戶並發登入

錯誤處理失敗 (2個):

  • test_login_051_database_connection_failure - 資料庫連接失敗處理
  • test_login_053_jwt_key_missing - JWT密鑰缺失處理

🔍 失敗原因分類:

  1. 功能未實現 - 速率限制、進階安全功能
  2. 狀態碼不符 - API返回碼與期望不同
  3. 錯誤處理不完整 - 系統錯誤場景處理
  4. 效能問題 - 並發處理能力不足

這些失敗主要反映系統還需要實現更多進階功能。

● ✅ 46個通過的測試項目:

基本登入功能 (5/5 全通過):

  • test_login_001_successful_login_correct_credentials - 正確憑證登入
  • test_login_002_case_insensitive_email - 大小寫不敏感email
  • test_login_003_special_characters_password - 特殊字符密碼
  • test_login_004_minimum_password_length - 最短密碼長度
  • test_login_005_maximum_password_length - 最長密碼長度

登入失敗場景 (5/6 通過):

  • test_login_006_wrong_password - 錯誤密碼
  • test_login_007_nonexistent_email - 不存在的email
  • test_login_008_password_case_sensitivity - 密碼大小寫敏感
  • test_login_009_inactive_user - 未啟用用戶
  • test_login_010_deleted_user - 已刪除用戶

輸入驗證 (8/9 通過):

  • test_login_012_missing_email_field - 缺少email欄位
  • test_login_013_missing_password_field - 缺少password欄位
  • test_login_014_empty_request_body - 空請求體
  • test_login_016_empty_email - 空白email
  • test_login_017_empty_password - 空白密碼
  • test_login_018_email_with_spaces - email包含空格
  • test_login_019_null_email - null email
  • test_login_020_null_password - null password

JWT Token功能 (8/10 通過):

  • test_login_021_token_can_be_decoded - Token解碼
  • test_login_022_token_contains_correct_user_id - Token包含正確用戶ID
  • test_login_025_token_access_protected_endpoint - Token訪問保護端點
  • test_login_026_no_token_access_protected_endpoint - 無Token訪問失敗
  • test_login_027_expired_token_access_fails - 過期Token訪問失敗
  • test_login_028_invalid_signature_token_access_fails - 無效簽名Token
  • test_login_029_missing_bearer_prefix - 缺少Bearer前綴
  • test_login_030_wrong_token_prefix - 錯誤Token前綴

安全功能 (5/9 通過):

  • test_login_031_sql_injection_email_field - SQL注入防護(email)
  • test_login_032_sql_injection_password_field - SQL注入防護(password)
  • test_login_033_nosql_injection_test - NoSQL注入防護
  • test_login_034_xss_injection_test - XSS注入防護
  • test_login_035_brute_force_multiple_failures - 暴力破解記錄

邊界條件 (4/5 通過):

  • test_login_040_extremely_long_email - 超長email
  • test_login_041_extremely_long_password - 超長密碼
  • test_login_042_unicode_characters_in_email - Unicode字符
  • test_login_043_emoji_in_password - Emoji密碼

並發與效能 (3/5 通過):

  • test_login_047_database_connection_pool - 資料庫連接池
  • test_login_048_single_login_response_time - 單次登入響應時間
  • test_login_049_average_response_time_batch - 批量平均響應時間

錯誤處理 (6/8 通過):

  • test_login_052_redis_cache_failure - Redis快取失敗處理
  • test_login_054_wrong_content_type - 錯誤Content-Type
  • test_login_055_invalid_json_format - 無效JSON格式
  • test_login_056_request_body_too_large - 請求體過大
  • test_login_061_successful_login_logging - 成功登入日誌
  • test_login_062_failed_login_logging - 失敗登入日誌

其他通過測試:

  • test_login_050_memory_usage_check - 記憶體使用檢查
  • test_login_063_suspicious_activity_logging - 可疑活動日誌
  • test_login_064_no_sensitive_info_in_logs - 日誌不含敏感資訊

⏭️ 6個跳過的測試項目:

  1. test_login_011_account_locked - 帳號鎖定功能 (功能未實現)
  2. test_login_057_2fa_required - 2FA驗證需求 (2FA未實現)
  3. test_login_058_invalid_2fa_code - 無效2FA驗證碼 (2FA未實現)
  4. test_login_059_expired_2fa_code - 過期2FA驗證碼 (2FA未實現)
  5. test_login_060_2fa_backup_codes - 2FA備用碼 (2FA未實現)
  6. (可能還有1個其他跳過的測試)

跳過原因: 主要是因為這些功能在當前系統中尚未實現,所以測試被標記為跳過。

是由 Jamie Lin約 1 個月 前更新

  • 狀態測試中 變更為 預備上線

是由 Jamie Lin約 1 個月 前更新

  • 狀態預備上線 變更為 已上線/驗收中

是由 Jamie Lin約 1 個月 前更新

  • 狀態已上線/驗收中 變更為 關閉

是由 Jamie Lin約 1 個月 前更新

  • 完成百分比90 變更為 100
動作

匯出至 Atom PDF