前言
用過JMeter參數化的小伙伴,想必對CSV Data Set Config非常熟悉。大家平時更關注變量名稱,是否忽略首行等參數,其余的一般都使用默認值。然而我最近遇到一個未按照我的預想讀取數據的案例,原因就出在最后一個參數“線程共享模式”上。記錄一下,大家避坑。
業務需求及腳本邏輯
某系統用戶提交訂單之后,在訂單列表頁面會新增一條記錄。
壓測前后,需要分別查詢訂單數量,根據提交訂單的成功事務數來判斷,是否所有的訂單都成功入庫。
但是,因為測試過程中多用戶并發,每個用戶只能查到自己的訂單,所以檢查時需要逐個檢查所有參與并發測試的用戶名下的訂單數量,然后加總求和。
詳情可參見JMeter案例分享:通過采樣器自動完成性能測試過程中的功能檢查-數據條目驗證-CSDN博客
查找問題
腳本調試時,僅使用有限幾個賬戶,一切正常。但是,當項目組提供真正的登錄賬號后,數據驗證總是對不上。于是,減少并發數,并把用戶、訂單數量信息一一打印出來查看。
原來:
業務前數據檢查的用戶是usr1、2、3
執行業務的用戶是usr4、5、6
業務后數據檢查的用戶又變成了usr7、8、9
分析原因
它們分屬3個線程組,雖然使用的是同一個數據文件,但是因為數據文件是放置在線程組內的,按照我的理解,作用域也應該僅限于本線程組,那么每一個線程組都應該從這個數據文件的第一行開始讀取。
然而,事實上,這個數據文件似乎是三個線程組間共享的。
于是,關注到CSV data set config中的共享模式(sharing mode)
官網中對該選項的介紹如下:
- All threads?- (the default) the file is shared between all the threads.(默認值,文件在所有的線程間共享)
- Current thread group?- each file is opened once for each thread group in which the element appears(文件僅在它所在的線程組中被打開一次)
- Current thread?- each file is opened separately for each thread(每個線程都單獨打開一份,也就是說,這個文件,每個線程都會獨自使用)
- Identifier?- all threads sharing the same identifier share the same file. So for example if you have 4 thread groups, you could use a common id for two or more of the groups to share the file between them. Or you could use the thread number to share the file between the same thread numbers in different thread groups.
下面我們分別設置來看看效果
All threads
默認值,效果前面已經看到了,所有的線程組中的所有線程,共享一個文檔,從第一行順序向下讀取。
Current thread group
文件僅在當前線程組中有效,本線程組結束后,下一個線程組將重新打開一遍數據文件,從第一行開始向下讀取。這就是我當前這個測試場景中需要的效果。
Current thread
數據文件僅在當前線程中有效。同一個線程組的不同線程間,不共享數據文件。
本例中數據驗證線程組是單線程,用循環控制器順序執行的,看不出效果,看業務線程組:3個并發執行1次,也就是三個線程,但是usr1登錄了3次。
也就是說,線程1打開數據文件,從第一行開始讀取;
線程2打開數據文件,從第一行開始讀取
每個線程讀取各自的文件。
Identifier
我在業務前數據驗證和業務線程組中分別輸入1,標識這兩個線程組是group 1
在業務后數據驗證線程組中,輸入2,標識這是group2
執行結果如下:
紅色的兩個線程組(group ID為1)作為一個group,共享數據文件。
黃色的線程組(group ID為2)作為一個group,獨享數據文件。
遺留問題
最后一種共享模式中這句話我不知道該怎么操作,官網沒有示例。
Or you could use the thread number to share the file between the same thread numbers in different thread groups.
?