一、
1、在性能測(cè)試工具:loadrunner和jmeter都有集合點(diǎn)的設(shè)置,locust當(dāng)然也有集合點(diǎn)的設(shè)置
2、什么是集合點(diǎn):
集合點(diǎn)用以同步虛擬用戶,以便恰好在同一時(shí)刻執(zhí)行任務(wù)。在[測(cè)試計(jì)劃]中,可能會(huì)要求系統(tǒng)能夠承受1000 人同時(shí)提交數(shù)據(jù),可以通過(guò)在提交數(shù)據(jù)操作前面加入集合點(diǎn),這樣當(dāng)虛擬用戶運(yùn)行到提交數(shù)據(jù)的集合點(diǎn)時(shí),就檢查同時(shí)有多少用戶運(yùn)行到集合點(diǎn),如果不到1000 人,已經(jīng)到集合點(diǎn)的用戶在此等待,當(dāng)在集合點(diǎn)等待的用戶達(dá)到1000 人時(shí),1000 人同時(shí)去提交數(shù)據(jù),從而達(dá)到測(cè)試計(jì)劃中的需求。
比如想完全并發(fā)1000個(gè)用戶提交訂單的操作,如果不設(shè)置集合點(diǎn)的情況下,前面500個(gè)用戶可能先登錄成功后就去提交訂單了,而后面的500個(gè)用戶還在登錄中,這樣就沒(méi)法完全達(dá)到1000個(gè)用戶同時(shí)去提交訂單
設(shè)置集合點(diǎn)后,前面500個(gè)登錄完成后不進(jìn)行提交訂單操作,直接等待到1000個(gè)用戶都登錄成功后,1000個(gè)人同時(shí)去提交訂單操作
from locust import HttpUser, TaskSet, task,between,events
from gevent._semaphore import Semaphore
all_locusts_spawned = Semaphore()
all_locusts_spawned.acquire()
def on_hatch_complete(**kwargs):
"""
Select_task類的鉤子方法
:param kwargs:
:return:
"""
all_locusts_spawned.release()
events.spawning_complete.add_listener(on_hatch_complete)
n = 0
class UserBehavior(TaskSet):
def login(self):
global n
n += 1
print("%s個(gè)虛擬用戶開始啟動(dòng),并登錄"%n)
def logout(self):
print("退出登錄")
def on_start(self):
self.login()
all_locusts_spawned.wait()
@task(4)
def test1(self):
"""
用戶瀏覽首頁(yè)商品列表
:return:
"""
url = '/list'
param = {
"limit":8,
"offset":0,
}
with self.client.get(url,params=param,headers={},catch_response = True) as response:
print("用戶瀏覽首頁(yè)商品列表")
@task(6)
def test2(self):
"""
用戶查看商品詳情
:return:
"""
url = '/detail'
param = {
'id':1
}
with self.client.get(url,params=param,headers={},catch_response = True) as response:
print("用戶瀏覽商品詳情")
@task(1)
def test3(self):
"""
用戶查看訂單列表
:return:
"""
url = '/order'
param = {
"limit":8,
"offset":0,
}
with self.client.get(url,params=param,headers={},catch_response = True) as response:
print("用戶查看訂單列表")
def on_stop(self):
self.logout()
class WebsiteUser(HttpUser):
host = 'http://127.0.0.1'
tasks = [UserBehavior]
wait_time = between(1, 2)
if __name__ == '__main__':
os.system("locust -f ccc.py")
運(yùn)行設(shè)置20個(gè)用戶并發(fā)

查看輸出日志:
[2021-09-28 23:57:00,003] MacBook-Air.local/INFO/locust.runners: Ramping to 20 users at a rate of 5.00 per second
1個(gè)虛擬用戶開始啟動(dòng),并登錄
2個(gè)虛擬用戶開始啟動(dòng),并登錄
3個(gè)虛擬用戶開始啟動(dòng),并登錄
4個(gè)虛擬用戶開始啟動(dòng),并登錄
5個(gè)虛擬用戶開始啟動(dòng),并登錄
6個(gè)虛擬用戶開始啟動(dòng),并登錄
7個(gè)虛擬用戶開始啟動(dòng),并登錄
8個(gè)虛擬用戶開始啟動(dòng),并登錄
9個(gè)虛擬用戶開始啟動(dòng),并登錄
10個(gè)虛擬用戶開始啟動(dòng),并登錄
11個(gè)虛擬用戶開始啟動(dòng),并登錄
12個(gè)虛擬用戶開始啟動(dòng),并登錄
13個(gè)虛擬用戶開始啟動(dòng),并登錄
14個(gè)虛擬用戶開始啟動(dòng),并登錄
15個(gè)虛擬用戶開始啟動(dòng),并登錄
[2021-09-28 23:57:03,020] MacBook-Air.local/INFO/locust.runners: All users spawned: {"WebsiteUser": 20} (20 total users)
16個(gè)虛擬用戶開始啟動(dòng),并登錄
17個(gè)虛擬用戶開始啟動(dòng),并登錄
18個(gè)虛擬用戶開始啟動(dòng),并登錄
19個(gè)虛擬用戶開始啟動(dòng),并登錄
20個(gè)虛擬用戶開始啟動(dòng),并登錄
用戶瀏覽首頁(yè)商品列表
用戶瀏覽商品詳情
用戶瀏覽商品詳情
用戶瀏覽商品詳情
用戶瀏覽商品詳情
用戶瀏覽商品詳情
用戶瀏覽商品詳情
用戶瀏覽商品詳情
。。。。。
可看出20個(gè)用戶全部都登錄完成后才開始執(zhí)行任務(wù)
另:在一般性能測(cè)試中需不需要設(shè)置集合點(diǎn)呢:
一、
Q:并發(fā)用戶數(shù)和集合點(diǎn)有必然聯(lián)系嗎?在性能測(cè)試中必須使用集合點(diǎn)來(lái)測(cè)試嗎?
A:并發(fā)用戶數(shù),顧名思義,就是同時(shí)操作的用戶,這里的“操作”可以指對(duì)系統(tǒng)真正的操作,也可以只是連接(此時(shí)通常叫作“并發(fā)連接數(shù)”),而集合點(diǎn)是一種特殊情況下的并發(fā),多用于測(cè)試系統(tǒng)在瞬間加壓的表現(xiàn)。因此,并發(fā)用戶數(shù)和集合點(diǎn)有聯(lián)系,但并非必然的聯(lián)系,在測(cè)試并發(fā)用戶的性能測(cè)試場(chǎng)景中,可以不必設(shè)置集合點(diǎn),這將視測(cè)試目標(biāo)和測(cè)試策略而定。
二、
Q:不設(shè)置集合點(diǎn)的測(cè)試,能代表是“并發(fā)”操作嗎?
A:有這樣一種說(shuō)法,設(shè)置集合點(diǎn)是為了確?!皣?yán)格意義上”的并發(fā),其實(shí)從本質(zhì)上看,這主要是一個(gè)看問(wèn)題的粒度大小的問(wèn)題。集合點(diǎn)的作用是通過(guò)工具的控制,確保一個(gè)請(qǐng)求嚴(yán)格地“同時(shí)”從前臺(tái)提交到后臺(tái)??墒侨绻⒂^地看,是不存在嚴(yán)格意義上的并發(fā)的,即使在客戶端通過(guò)設(shè)置集合點(diǎn)的方式將100個(gè)請(qǐng)求同時(shí)提交到后臺(tái),經(jīng)過(guò)網(wǎng)絡(luò)上的傳輸消耗,可能它們并不是同時(shí)到達(dá)的,而即便100個(gè)請(qǐng)求同時(shí)到達(dá)服務(wù)器端,受到中間件和應(yīng)用系統(tǒng)、數(shù)據(jù)庫(kù)的各種連接池、緩沖區(qū),CPU處理隊(duì)列等的限制,也可能在服務(wù)器端產(chǎn)生等待的。因此,嚴(yán)格意義上的“并發(fā)”可以說(shuō)是不存在的,我們需要做的是在可以接受的粒度范圍內(nèi)取得一個(gè)最佳的平衡點(diǎn),站在這個(gè)平衡點(diǎn)的層面上去看待“并發(fā)”這個(gè)問(wèn)題。
性能測(cè)試無(wú)非有兩個(gè)目的,一是評(píng)測(cè),二是調(diào)優(yōu)。
在以評(píng)測(cè)為目的的性能測(cè)試中,用戶更關(guān)心的是業(yè)務(wù)上的并發(fā),也就是真實(shí)業(yè)務(wù)場(chǎng)景的并發(fā)情況,這種情況下只要按照業(yè)務(wù)操作的模式去設(shè)置場(chǎng)景就可以了,并不需要設(shè)置集合點(diǎn)。
集合點(diǎn)是一種特殊情況下的并發(fā),通常是在以調(diào)優(yōu)為目的的性能測(cè)試中才會(huì)用得到,目的是有針對(duì)性地對(duì)某個(gè)可能存在性能問(wèn)題的模塊施壓,以便找到性能瓶頸。
如果是對(duì)一些業(yè)務(wù)場(chǎng)景進(jìn)行壓力測(cè)試、穩(wěn)定性測(cè)試時(shí),可以不必設(shè)置集合點(diǎn)。如果想驗(yàn)證單獨(dú)某一個(gè)接口對(duì)大并發(fā)的處理能力時(shí),設(shè)置集合點(diǎn)就很有必要了。