locust性能測(cè)試:設(shè)置集合點(diǎn)(五)

一、

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ā)

image.png

查看輸出日志:

[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)就很有必要了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 簡(jiǎn)答題(2*10=20分)客戶交付一個(gè)性能測(cè)試項(xiàng)目,請(qǐng)闡述你的實(shí)施流程。答案: 測(cè)試設(shè)計(jì)階段: 1)了解被測(cè)系統(tǒng)的...
    一箭閱讀 2,118評(píng)論 0 6
  • 軟件測(cè)試教程 性能測(cè)試Loadrunner篇(二) 上節(jié)課主要講述了性能測(cè)試的基本知識(shí),現(xiàn)在開始介紹性能測(cè)試工具L...
    zzulj閱讀 3,853評(píng)論 0 12
  • 一.相關(guān)概念: 1.性能測(cè)試,是指在一定的軟件、硬件及網(wǎng)絡(luò)條件下,通過(guò)自動(dòng)化的測(cè)試工具模擬 多種正常、峰值以及異常...
    永杰gg閱讀 1,002評(píng)論 0 0
  • 1.性能測(cè)試怎么做的? 參考答案: 比如,我這個(gè)xxx項(xiàng)目的性能測(cè)試是這樣做的: 1.做性能需求分析,挑選了用戶使...
    rilakkumaboy閱讀 576評(píng)論 0 9
  • 今天青石的票圈出鏡率最高的,莫過(guò)于張藝謀的新片終于定檔了。 一張滿溢著水墨風(fēng)的海報(bào)一次次的出現(xiàn)在票圈里,也就是老謀...
    青石電影閱讀 10,784評(píng)論 1 2

友情鏈接更多精彩內(nèi)容