「原創宣告:保留所有權利,禁止轉載」
在效能測試中,Rump-Up 功能是一個非常重要的特性,它允許測試人員逐步增加系統負載,從而觀察系統在不同壓力下的表現。透過逐步增加負載,測試人員可以更準確地識別系統的效能瓶頸、容量限制以及潛在的缺陷。以下是對 Rump-Up 功能的詳細解釋和實現步驟的總結:
Rump-Up 功能的核心概念
逐步增加負載:Rump-Up 階段從零負載開始,逐步增加壓力,直到達到預期的最大負載。這個過程模擬了真實世界中系統負載逐漸增加的情況。
觀察系統表現:在 Rump-Up 過程中,測試人員可以觀察系統在負載逐漸增加時的效能表現,識別系統的效能拐點和瓶頸。
資料收集控制:為了避免低負載階段的資料影響最終測試報告的準確性,通常在 Rump-Up 階段不收集效能資料,等到所有執行緒都啟動並達到最大負載後再開始收集資料。
實現 Rump-Up 功能的關鍵步驟
-
多執行緒任務類的改造:
-
增加資料收集開關:在多執行緒任務類中增加一個布林型別的開關(
countState
),用於控制是否記錄響應時間。 - 增加 CountDownLatch:用於同步 Rump-Up 階段的執行緒啟動狀態。每個執行緒啟動後,計數器減一,等到所有執行緒都啟動後,Rump-Up 階段結束。
-
增加資料收集開關:在多執行緒任務類中增加一個布林型別的開關(
-
執行類的改造:
- 計算執行緒啟動間隔:根據 Rump-Up 的總時間和執行緒數量,計算每個執行緒的啟動間隔時間。
- 逐步啟動執行緒:按照計算出的間隔時間逐步啟動執行緒,模擬負載逐漸增加的過程。
-
等待 Rump-Up 結束:使用
CountDownLatch
等待所有執行緒啟動完畢,然後開啟資料收集。
-
資料收集的控制:
-
Rump-Up 階段不收集資料:在 Rump-Up 階段,
countState
為false
,不記錄響應時間。 -
Rump-Up 結束後開始收集資料:當所有執行緒啟動完畢後,將
countState
設定為true
,開始記錄響應時間。
-
Rump-Up 階段不收集資料:在 Rump-Up 階段,
程式碼示例
以下是多執行緒任務類和執行類的關鍵程式碼片段:
多執行緒任務類
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 自動化
- 理論、感悟、影片
如果覺得我的文章對您有用,請隨意打賞。您的支援將鼓勵我繼續創作!
打賞支援
暫無回覆。