美文网首页
locust性能测试:设置集合点(五)

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

作者: HC2 | 来源:发表于2021-09-28 23:59 被阅读0次

    一、

    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处理队列等的限制,也可能在服务器端产生等待的。因此,严格意义上的“并发”可以说是不存在的,我们需要做的是在可以接受的粒度范围内取得一个最佳的平衡点,站在这个平衡点的层面上去看待“并发”这个问题。
    性能测试无非有两个目的,一是评测,二是调优。
    在以评测为目的的性能测试中,用户更关心的是业务上的并发,也就是真实业务场景的并发情况,这种情况下只要按照业务操作的模式去设置场景就可以了,并不需要设置集合点。
    集合点是一种特殊情况下的并发,通常是在以调优为目的的性能测试中才会用得到,目的是有针对性地对某个可能存在性能问题的模块施压,以便找到性能瓶颈。

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

    相关文章

      网友评论

          本文标题:locust性能测试:设置集合点(五)

          本文链接:https://www.haomeiwen.com/subject/uyednltx.html