locust性能测试:设置集合点(五)

2021-09-28  本文已影响0人  HC2

一、

1、在性能测试工具:loadrunner和jmeter都有集合点的设置,locust当然也有集合点的设置
2、什么是集合点:

集合点用以同步虚拟用户,以便恰好在同一时刻执行任务。在[测试计划]中,可能会要求系统能够承受1000 人同时提交数据,可以通过在提交数据操作前面加入集合点,这样当虚拟用户运行到提交数据的集合点时,就检查同时有多少用户运行到集合点,如果不到1000 人,已经到集合点的用户在此等待,当在集合点等待的用户达到1000 人时,1000 人同时去提交数据,从而达到测试计划中的需求。

比如想完全并发1000个用户提交订单的操作,如果不设置集合点的情况下,前面500个用户可能先登录成功后就去提交订单了,而后面的500个用户还在登录中,这样就没法完全达到1000个用户同时去提交订单

设置集合点后,前面500个登录完成后不进行提交订单操作,直接等待到1000个用户都登录成功后,1000个人同时去提交订单操作

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个虚拟用户开始启动,并登录"%n)

    def logout(self):
        print("退出登录")



    def on_start(self):
        self.login()

        all_locusts_spawned.wait()

    @task(4)
    def test1(self):
        """
        用户浏览首页商品列表
        :return:
        """

        url = '/list'
        param = {
            "limit":8,
            "offset":0,
        }
        with self.client.get(url,params=param,headers={},catch_response = True) as response:
            print("用户浏览首页商品列表")

    @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")

运行设置20个用户并发

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个虚拟用户开始启动,并登录
2个虚拟用户开始启动,并登录
3个虚拟用户开始启动,并登录
4个虚拟用户开始启动,并登录
5个虚拟用户开始启动,并登录
6个虚拟用户开始启动,并登录
7个虚拟用户开始启动,并登录
8个虚拟用户开始启动,并登录
9个虚拟用户开始启动,并登录
10个虚拟用户开始启动,并登录
11个虚拟用户开始启动,并登录
12个虚拟用户开始启动,并登录
13个虚拟用户开始启动,并登录
14个虚拟用户开始启动,并登录
15个虚拟用户开始启动,并登录
[2021-09-28 23:57:03,020] MacBook-Air.local/INFO/locust.runners: All users spawned: {"WebsiteUser": 20} (20 total users)
16个虚拟用户开始启动,并登录
17个虚拟用户开始启动,并登录
18个虚拟用户开始启动,并登录
19个虚拟用户开始启动,并登录
20个虚拟用户开始启动,并登录
用户浏览首页商品列表
用户浏览商品详情
用户浏览商品详情
用户浏览商品详情
用户浏览商品详情
用户浏览商品详情
用户浏览商品详情
用户浏览商品详情

。。。。。

可看出20个用户全部都登录完成后才开始执行任务

另:在一般性能测试中需不需要设置集合点呢:

一、
Q:并发用户数和集合点有必然联系吗?在性能测试中必须使用集合点来测试吗?
A:并发用户数,顾名思义,就是同时操作的用户,这里的“操作”可以指对系统真正的操作,也可以只是连接(此时通常叫作“并发连接数”),而集合点是一种特殊情况下的并发,多用于测试系统在瞬间加压的表现。因此,并发用户数和集合点有联系,但并非必然的联系,在测试并发用户的性能测试场景中,可以不必设置集合点,这将视测试目标和测试策略而定。
二、
Q:不设置集合点的测试,能代表是“并发”操作吗?
A:有这样一种说法,设置集合点是为了确保“严格意义上”的并发,其实从本质上看,这主要是一个看问题的粒度大小的问题。集合点的作用是通过工具的控制,确保一个请求严格地“同时”从前台提交到后台。可是如果微观地看,是不存在严格意义上的并发的,即使在客户端通过设置集合点的方式将100个请求同时提交到后台,经过网络上的传输消耗,可能它们并不是同时到达的,而即便100个请求同时到达服务器端,受到中间件和应用系统、数据库的各种连接池、缓冲区,CPU处理队列等的限制,也可能在服务器端产生等待的。因此,严格意义上的“并发”可以说是不存在的,我们需要做的是在可以接受的粒度范围内取得一个最佳的平衡点,站在这个平衡点的层面上去看待“并发”这个问题。
性能测试无非有两个目的,一是评测,二是调优。
在以评测为目的的性能测试中,用户更关心的是业务上的并发,也就是真实业务场景的并发情况,这种情况下只要按照业务操作的模式去设置场景就可以了,并不需要设置集合点。
集合点是一种特殊情况下的并发,通常是在以调优为目的的性能测试中才会用得到,目的是有针对性地对某个可能存在性能问题的模块施压,以便找到性能瓶颈。

如果是对一些业务场景进行压力测试、稳定性测试时,可以不必设置集合点。如果想验证单独某一个接口对大并发的处理能力时,设置集合点就很有必要了。

上一篇下一篇

猜你喜欢

热点阅读