【連載 19】Rump-Up 功能

FunTester發表於2025-03-01

在效能測試中,Rump-Up 功能是一個非常重要的特性,它允許測試人員逐步增加系統負載,從而觀察系統在不同壓力下的表現。透過逐步增加負載,測試人員可以更準確地識別系統的效能瓶頸、容量限制以及潛在的缺陷。以下是對 Rump-Up 功能的詳細解釋和實現步驟的總結:

Rump-Up 功能的核心概念

  1. 逐步增加負載:Rump-Up 階段從零負載開始,逐步增加壓力,直到達到預期的最大負載。這個過程模擬了真實世界中系統負載逐漸增加的情況。

  2. 觀察系統表現:在 Rump-Up 過程中,測試人員可以觀察系統在負載逐漸增加時的效能表現,識別系統的效能拐點和瓶頸。

  3. 資料收集控制:為了避免低負載階段的資料影響最終測試報告的準確性,通常在 Rump-Up 階段不收集效能資料,等到所有執行緒都啟動並達到最大負載後再開始收集資料。

實現 Rump-Up 功能的關鍵步驟

  1. 多執行緒任務類的改造

    • 增加資料收集開關:在多執行緒任務類中增加一個布林型別的開關(countState),用於控制是否記錄響應時間。
    • 增加 CountDownLatch:用於同步 Rump-Up 階段的執行緒啟動狀態。每個執行緒啟動後,計數器減一,等到所有執行緒都啟動後,Rump-Up 階段結束。
  2. 執行類的改造

    • 計算執行緒啟動間隔:根據 Rump-Up 的總時間和執行緒數量,計算每個執行緒的啟動間隔時間。
    • 逐步啟動執行緒:按照計算出的間隔時間逐步啟動執行緒,模擬負載逐漸增加的過程。
    • 等待 Rump-Up 結束:使用CountDownLatch等待所有執行緒啟動完畢,然後開啟資料收集。
  3. 資料收集的控制

    • Rump-Up 階段不收集資料:在 Rump-Up 階段,countStatefalse,不記錄響應時間。
    • Rump-Up 結束後開始收集資料:當所有執行緒啟動完畢後,將countState設定為true,開始記錄響應時間。

程式碼示例

以下是多執行緒任務類和執行類的關鍵程式碼片段:

多執行緒任務類

public class ThreadTask implements Runnable {
    public CountDownLatch rumpUpCountDownLatch;
    public boolean countState = false;
    public List<Integer> costTime = new ArrayList<>();

    @Override
    public void run() {
        rumpUpCountDownLatch.countDown(); // 計數器減一
        try {
            before(); // 前置處理
            while (true) {
                if (ABORT.get() || needStop || executeNum >= totalNum) {
                    break; // 判斷是否終止測試任務
                }
                try {
                    if (countState) {
                        executeNum++; // 記錄執行次數
                        long start = System.currentTimeMillis(); // 記錄開始時間
                        test(); // 測試方法
                        long end = System.currentTimeMillis(); // 記錄結束時間
                        costTime.add((int) (end - start)); // 記錄耗時
                    } else {
                        test(); // 測試方法
                    }
                } catch (Exception e) {
                    if (countState) errorNum++; // 記錄錯誤次數
                    e.printStackTrace();
                }
            }
            after(); // 後置處理
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            stopCountDownLatch.countDown(); // 計數器減一
        }
    }
}

執行類

public class TaskExecutor {
    public CountDownLatch rumpUpCountDownLatch;
    public int rumpUpTime; // Rump-Up的總時間,單位秒

    public TaskExecutor(List<ThreadTask> tasks, String taskDesc, int rumpUpTime) {
        this.tasks = tasks;
        this.taskDesc = taskDesc;
        this.rumpUpTime = rumpUpTime;
        this.rumpUpCountDownLatch = new CountDownLatch(tasks.size());
        for (ThreadTask task : tasks) {
            task.rumpUpCountDownLatch = rumpUpCountDownLatch;
        }
    }

    public void start() {
        int gap = rumpUpTime * 1000 / tasks.size(); // 計算每個執行緒的啟動間隔
        for (ThreadTask task : tasks) {
            poolExecutor.execute(task); // 提交執行緒池執行
            ThreadTool.sleep(gap); // 休眠,間隔提交多執行緒任務
        }
        try {
            rumpUpCountDownLatch.await(); // 等待Rump-Up計數器為0
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        tasks.forEach(f -> f.countState = true); // 開啟資料收集
        System.out.println("Rump-Up結束, 開始執行測試任務!");
        this.startTimestamp = System.currentTimeMillis(); // 記錄開始時間
    }
}

總結

透過上述改造,效能測試引擎具備了 Rump-Up 功能,能夠逐步增加系統負載,並在 Rump-Up 階段結束後開始收集效能資料。這種設計不僅能夠更準確地模擬真實世界的負載情況,還能避免低負載階段的資料對測試結果的干擾。最終,測試人員可以透過分析測試報告,識別系統的效能瓶頸和容量限制,從而最佳化系統效能。

FunTester 原創精華

【連載】從 Java 開始效能測試

  • 故障測試與 Web 前端
  • 服務端功能測試
  • 效能測試專題
  • Java、Groovy、Go
  • 白盒、工具、爬蟲、UI 自動化
  • 理論、感悟、影片
如果覺得我的文章對您有用,請隨意打賞。您的支援將鼓勵我繼續創作!
打賞支援
暫無回覆。

相關文章