線程組元件是任何一個測試計划的開始點。在一個測試計划中的所有元件都必須在某個線程下。所有的任務都是基於線程組
一、setup thread group
一種特殊類型的ThreadGroup,用於在執行常規線程組之前執行一些必要的操作。在“setup thread group ”下的線程行為與普通線程組完全相同。不同的是執行順序:它會在普通線程組執行之前被觸發。
應用場景舉例:
A、測試數據庫操作功能時,用於執行打開數據庫連接的操作。
B、測試用戶購物功能時,用於執行用戶的注冊、登錄等操作。
二、teardown thread group
一種特殊類型的ThreadGroup,用於在執行常規線程組完成后執行一些必要的操作。在“teardown thread group ”下的線程行為與普通線程組完全相同。不同的是執行順序:它會在普通線程組執行之后被觸發。
應用場景舉例:
A、測試數據庫操作功能時,用於執行關閉數據庫連接的操作。
B、測試用戶購物功能時,用於執行用戶的退出等操作。
注意:默認情況下,如果測試按預期完成,則TearDown線程組將不會運行。如果你想要運行它,則需要從Test Plan界面中選中復選框“Run tearDown Thread Groups after shutdown of main threads”。
三、thread group(線程組)
這個就是我們通常使用的線程。一個線程組可以看做一個虛擬用戶組,線程組中的每個線程都可以理解為一個虛擬用戶。多個用戶同時去執行相同的一批次任務。每個線程之間都是隔離的,互不影響的。一個線程的執行過程中,操作的變量,不會影響其他線程的變量值。
1、在取樣器錯誤后要執行的動作
- 繼續:忽略錯誤,繼續執行操作(其他取樣器不受影響,繼續執行)
例如線程組中包含查詢設備和查詢服務商2個請求,若查詢設備請求失敗,查詢服務商請求會繼續執行。
- Start Next Thread Loop:忽略錯誤,停止當前線程組並直接啟動下一個線程組;如設置循環次數非1,那么遇到一個線程失敗,線程組當前循環終止,執行下一個循環。
例一:線程組中包含查詢設備和查詢服務商2個請求且循環次數非1,若查詢設備請求失敗,查詢服務商請求將不再執行,等下一次重新迭代,從查詢設備開始執行。
例二:測試計划中包含線程組1和線程組2,線程組1的循環次數是1,那么線程組1執行出錯時,會直接啟動線程組2
- 停止線程:停止當前線程,其他線程不受影響
- 停止測試:在所有當前正在執行的線程執行完畢后停止整個測試計划
- Stop Test Now:立即停止整個測試計划
如測試計划設置了【獨立運行每個線程組(例如在一個組運行結束后啟動另一個)】
則線程組1中的某個請求失敗了,線程組2中的請求不會被執行
2、線程屬性
- 線程數:當前線程組的線程數量,可以簡單的理解為用戶數量。
- Ramp-up Period (in seconds):達到上面指定線程數所花費的時間,單位為秒。舉個例子:假設線程數為100個,花費時間20s,那么每秒啟動的線程數 = 線程數/時間,即100/20 = 5,也就是每隔1秒啟動5個線程。
- 循環次數:設置的線程數循環的次數。勾選“永遠”選項,則線程組一直循環(注意:如果勾選了永遠且調度器配置中設置了持續時間,則會在持續時間到達之后結束循環)。
- Delay Thread creation until needed:當線程需要執行的時候,才會被創建。如果不勾選此選項,所有線程在開始時就全部被創建。
此選項和Ramp-up Period設置配合使用,如果勾選此項,則所有線程會在需要的時候啟動,即會在Ramp-up Period(in seconds)到時間后啟動所有線程,此項作用在於,如果說線程運行時間小於我們設置的Ramp-up Period(in seconds),則會造成一種情況就是在Ramp-up Period(in seconds)結束之前部分線程已經跑完了,這樣就會導致活動線程數小於我們設置的線程數,也就意味着我們設置的N個並發的場景並未完全起效。但是如果勾選了此項,則線程會根據Ramp-up Period(in seconds)設置來創建,但是不會啟動,直到最后一個線程創建好后一起啟動(這樣就會很好的模擬到我們的N個並發數了)
如果單個線程的運行時間長於我們設置的Ramp-up Period(in seconds)時間,則此項也不用勾選。
舉例說明:如過設置線程數為10,Ramp-up Period(in seconds)時間為100,則如果不勾選此項則此次測試會每隔10s創建並啟動一個線程,那么100s后會有1-10個線程在運行;但是如果勾選此項,那么線程組會每隔10s創建一個線程但並不啟動sample,而是會等待100s后所有10個線程都創建好之后同時啟動sample。
- 調度器:勾選此選項,才可修改下面的調度器配置。
持續時間(秒):整個測試計划持續的時間。(優先於后面的結束時間選項)。注意這個時間設置不要設置的比 Ramp-up Period(in seconds)小,如果勾選了循環次數中的永遠,那么測試一樣會在此持續時間到達后結束。
啟動延遲(秒):測試計划啟動后,會被延遲啟動,時間為選項填入的時間。(優先於后面的啟動時間選項)
啟動時間:整個測試計划將於此處填寫的時間點啟動
結束時間:整個測試計划將於此處填寫的時間點結束
如果不想立即執行執行,可以通過調度器控制測試執行的開始時間和結束時間
補充線程知識:
- 新建狀態:使用 new 關鍵字和 Thread 類或其子類建立一個線程對象后,該線程對象就處於新建狀態。它保持這個狀態直到程序 start() 這個線程。
- 就緒狀態:當線程對象調用了start()方法之后,該線程就進入就緒狀態。就緒狀態的線程處於就緒隊列中,要等待JVM里線程調度器的調度。
- 運行狀態:如果就緒狀態的線程獲取 CPU 資源,就可以執行 run(),此時線程便處於運行狀態。處於運行狀態的線程最為復雜,它可以變為阻塞狀態、就緒狀態和死亡狀態。
- 阻塞狀態:如果一個線程執行了sleep(睡眠)、suspend(掛起)等方法,失去所占用資源之后,該線程就從運行狀態進入阻塞狀態。在睡眠時間已到或獲得設備資源后可以重新進入就緒狀態。可以分為三種:
-
- 等待阻塞:運行狀態中的線程執行 wait() 方法,使線程進入到等待阻塞狀態。
- 同步阻塞:線程在獲取 synchronized 同步鎖失敗(因為同步鎖被其他線程占用)。
- 其他阻塞:通過調用線程的 sleep() 或 join() 發出了 I/O 請求時,線程就會進入到阻塞狀態。當sleep() 狀態超時,join() 等待線程終止或超時,或者 I/O 處理完畢,線程重新轉入就緒狀態。
- 死亡狀態:一個運行狀態的線程完成任務或者其他終止條件發生時,該線程就切換到終止狀態。