iT邦幫忙

2026 iThome 鐵人賽

DAY 25
0
Build on Google AI

給藥袋裝一張嘴:30 天用 Android 與 Google VLM 實作高齡語音用藥助手系列 第 25 篇

Day 25|考驗系統承載極限!實作全系統 E2E 端到端測試與 Locust 壓測防線

  • 分享至 

  • xImage
  •  

✏️【本日實作紀錄:端到端整合測試與 Locust 壓力測試】

在 Day 24 完成 雲端 VPS 一鍵自動化部署 與 Let's Encrypt SSL/TLS 數位憑證 設定後,PrescriptionVLM 系統已運行於正式公網環境。

然而,系統在實際上線後,可能會遇到多位長輩或照護者在用藥時間同時上傳藥袋照片的情境。為了驗證系統在高併發請求下的穩定性,以及確定 Day 19 實作的 Redis 快取與 API 限流機制 是否有效,我們需要進行完整的 端到端測試(E2E Testing) 與 Locust 壓力測試(Load Testing)。

今天我們將為 PrescriptionVLM 系統建立 自動化 E2E 測試與 Locust 負載壓測。完成項目包含:

  • E2E 流程自動化驗證 — 模擬使用者從圖片上傳、VLM 解析、寫入 Redis 快取到 LINE 訊息推播的完整流程測試。
  • Locust 負載壓力測試腳本 — 模擬數十至數百位使用者同時上傳圖片,測試系統的 RPS (Requests Per Second) 與平均回應延遲。
  • 快取效能與限流防衛驗證 — 驗證快取命中情況下的效能變化,以及過載時是否能觸發 HTTP 429 限制。

一、壓測與 E2E 測試架構

在正式發布產品前,進行端到端與壓力測試有以下好處:

  • 驗證全鏈路整合:E2E 測試確保 Web API、Gemini VLM、Redis 快取與 LINE Push Notification 整個流程順暢。
  • 找出系統效能瓶頸:在不同使用者數量下評估系統回應時間,確認 Gunicorn Worker 數量與 Nginx 超時設定是否足夠。
  • 驗證快取節流效益:比對第一次上傳與重複上傳的系統負載差距,量化 Redis 帶來的效能改進。

二、升級專案依賴(requirements.txt)

請開啟專案根目錄的 requirements.txt,加入 Locust 壓力測試套件:

locust==2.23.1

三、實作全系統端到端測試(tests/test_e2e.py)

請在專案中建立 tests/test_e2e.py 檔案,寫入模擬完整分析流程的 E2E 測試:

import pytest
import os
import io

def test_full_prescription_analysis_pipeline(client):
    """測試從圖片上傳、VLM 解析、Redis 快取到 LINE 推播的完整流程"""
    # 建立測試用模擬圖片二進位資料
    test_image_bytes = b"fake_prescription_image_data_for_e2e_testing"
    
    data = {
        'image': (io.BytesIO(test_image_bytes), 'test_rx.jpg')
    }
    
    # 1. 第一次發送請求(預期:Cache Miss)
    response1 = client.post(
        '/analyze-prescription',
        data=data,
        content_type='multipart/form-data'
    )
    
    assert response1.status_code in [200, 429, 503]
    if response1.status_code == 200:
        json_data1 = response1.get_json()
        assert json_data1['status'] == 'success'
        assert json_data1['cached'] is False
        assert 'request_id' in json_data1

        # 2. 第二次發送相同圖片請求(預期:Cache Hit 快取命中)
        data_cached = {
            'image': (io.BytesIO(test_image_bytes), 'test_rx.jpg')
        }
        response2 = client.post(
            '/analyze-prescription',
            data=data_cached,
            content_type='multipart/form-data'
        )
        
        assert response2.status_code == 200
        json_data2 = response2.get_json()
        assert json_data2['status'] == 'success'
        assert json_data2['cached'] is True

四、撰寫 Locust 壓力測試腳本(locustfile.py)

在專案根目錄建立 locustfile.py,設定模擬使用者的行為模式:

from locust import HttpUser, task, between
import io

class PrescriptionVLMUser(HttpUser):
    # 模擬使用者在每次操作之間的等待時間(1 到 3 秒)
    wait_time = between(1, 3)

    def on_start(self):
        """初始化測試圖片數據"""
        self.test_image = b"locust_load_test_prescription_image_bytes"

    @task(3)
    def test_dashboard(self):
        """模擬使用者瀏覽儀表板頁面 (權重: 3)"""
        self.client.get("/dashboard", name="GET /dashboard")

    @task(1)
    def test_analyze_prescription(self):
        """模擬使用者上傳藥單照片進行分析 (權重: 1)"""
        files = {
            'image': ('test_rx.jpg', io.BytesIO(self.test_image), 'image/jpeg')
        }
        headers = {
            'X-Request-ID': 'locust-test-trace-id'
        }
        self.client.post(
            "/analyze-prescription",
            files=files,
            headers=headers,
            name="POST /analyze-prescription"
        )

五、執行壓力測試與成果驗證

1. 啟動 Locust 壓測 Web 介面

在 Terminal 執行命令啟動 Locust:

locust -f locustfile.py --host=http://127.0.0.1
  • 啟動後在瀏覽器開啟 http://localhost:8089。
  • 設定模擬使用者數為 50,每秒爬升人數設定為 5。

2. 驗證壓測與快取效能數據

點擊 Start Swarming 執行測試,觀察 Locust 統計儀表板:

  • 吞吐量 (RPS):儀表板頁面回應時間在合理範圍內。
  • 快取效益驗證:第二次後的圖片解析請求被 Redis 快取截流,API 回應速度明顯改進。
  • 限流防護驗證:當單一 IP 請求頻率超過限制時,系統能回應 429 Too Many Requests,後端 Gunicorn 伺服器運作穩定。

六、版本控制與提交 GitHub

測試通過後,將 Day 25 的修改提交至 GitHub:

git add requirements.txt tests/test_e2e.py locustfile.py
git commit -m "保留雙引號 改填寫自己要記錄的標記 ex.鐵人賽第二十五天"
git push

七、本日小結與明日預告

今天我們透過 自動化 E2E 端到端測試 與 Locust 負載壓力測試,驗證了 PrescriptionVLM 系統在尖峰流量下的承載能力與快取防禦機制。

明天(Day 26),我們將進入專案維護與營運階段,實作 Grafana / Prometheus 系統數據監控面板與異常警報通知,讓營運者隨時掌握系統健康狀況!


上一篇
Day 24|公網營運安全第一線!雲端自動化部署腳本與 Let's Encrypt SSL/TLS 憑證實作
系列文
給藥袋裝一張嘴:30 天用 Android 與 Google VLM 實作高齡語音用藥助手 共 25 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言