高并发

FastHttpUser类
locust的HTTP客户端默认是使用requests模块实现的,但是在大规模并发http请求时,requests模块并不是最优的实现,为了解决并发资源消耗问题,locust建议使用faster HTTP client的实现,它使用了geventhttpclient代替了requests. 它能提升5-6倍的并发量。

使用方法就是用FastHttpUser代替HttpUser

from locust import TaskSet, task, between
from locust.contrib.fasthttp import FastHttpUser
import jsonclass MyTasks(TaskSet):url = '/user/login'headers = {'Content-Type': 'application/json'}def setup(self):print("任务初始化")def teardown(self):print("任务结束")def on_start(self):print("用户初始化--登录")def on_stop(self):print("结束")@taskdef post_login(self):print('用户登录...')class User(FastHttpUser):tasks = [MyTasks]host = "http://www.baidu.com"wait_time = between(2,2)def setup(self):print("Locust 初始化")def teardown(self):print("Locust 结束")if __name__ == '__main__':import osos.system("locust -f Fitest.py")

在相同的并发条件下使用FastHttpUser能有效减少对负载机的资源消耗从而达到更大的http请求。

参数关联

参数关联在接口测试中经常用到,比如token传递、接口上下级关联等。
Authorization传递及关联

from locust import HttpUser, TaskSet, task, between
import os
import json# 任务类
# 需要继承Locust类
class MyTasks(TaskSet):url = '/user/login'headers = {'Content-Type': 'application/json'}def setup(self):print("任务初始化")def teardown(self):print("任务结束")def on_start(self):# 登录只执行一次 获取tokenglobal Authorization  # 定义global关键字print("用户初始化--登录获取token")self.data = {"username":"admin","password":"123456"}respon = self.client.post(self.url, headers = self.headers, data=json.dumps(self.data), name='用户登录', verify=False, timeout=10)resp_dict = respon.json()# print(f'响应数据为:{resp_dict}')if respon.status_code == 200:# 成功print(resp_dict['msg'])# 登录成功后 确定token是在data里面还是headers里面Authorization = respon.headers['Authorization']print(f'Authorization数据为:{Authorization}')return Authorizationelse:# 失败respon.failure(resp_dict['msg'])def on_stop(self):print("用户--结束")@taskdef post_login(self):print('自定义函数执行...')print(Authorization)# Locust类
class User(HttpUser):tasks = [MyTasks]host = 'http://www.baidu.com'wait_time = between(2, 2)if __name__ == '__main__':os.system("locust -f test.py")

可以看出 自定义函数已经输出了token值

集合点

集合点用于真实模拟线上用户操作。在实际的压测场景当中,经常需要在某一个时间点集中并发测试(如:秒杀场景、购物车支付等),这个时候就需要用到集合点,让所有用户全部完成初始化后集中发起压力,在locust中可以使用gevent中Semaphore 实现。

Semaphore对象内部管理一个计数器,该计数器由每个acquire()调用递减,并由每个release()调用递增。计数器永远不会低于零,当acquire()发现计数器为零时,线程阻塞,等待其他线程调用release()

SequentialTaskSet集合点

场景模拟:一个购物系统,测试开始5个用户启动完毕后先对浏览商品行为压测持续3次,然后5用户在对支付订单行为进行压测一次,再然后是对创建订单压测2次,最后对退出浏览该商品行为压测2次,循环执行上述步骤

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File    : test.py
# @Software: PyCharm
import datetime
from locust import TaskSet, task, events, SequentialTaskSet, HttpUser, between
from gevent._semaphore import Semaphore# 创建集合点,当locust实例产生完成时触发(即10用户启动完毕)
all_locusts_spawned = Semaphore()
all_locusts_spawned.acquire()def on_hatch_complete(**kwargs):all_locusts_spawned.release()events.spawning_complete.add_listener(on_hatch_complete)def login(self):# 用户登录函数print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')+'用户登陆!')def logout(self):# 用户退出函数print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')+'用户退出')class Sequential(SequentialTaskSet):def on_start(self):# 每个线程只执行一次login(self)def on_stop(self):# 每个线程只执行一次logout(self)@task(3)    # 设置执行次数def BrowseGoods(self):all_locusts_spawned.wait()  # 集合点等待并发print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') + '浏览商品')@task(1)def PayOrder(self):all_locusts_spawned.wait()print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') + '支付订单')@task(2)def CreateOrder(self):all_locusts_spawned.wait()print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') + '创建订单')@task(2)def leave(self):all_locusts_spawned.wait()print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') + '退出浏览该商品')class User(HttpUser):tasks = [Sequential]host = 'https://www.baidu.com/'wait_time = between(2, 2)if __name__ == '__main__':import osos.system("locust -f test2.py")
[2021-11-25 16:08:34,289] songpeilunMacBook-Pro.local/INFO/locust.main: Starting web interface at                 http://0.0.0.0:8089 (accepting connections from all network interfaces)
[2021-11-25 16:08:34,298] songpeilunMacBook-Pro.local/INFO/locust.main: Starting Locust 1.4.3
[2021-11-25 16:08:34,310] songpeilunMacBook-Pro.local/INFO/root: Terminal was not a tty. Keyboard input disabled
[2021-11-25 16:08:58,262] songpeilunMacBook-Pro.local/INFO/locust.runners: Spawning 5 users at the rate 1 users/s (0 users already running)...
2021-11-25 16:08:58.263733用户登陆!
2021-11-25 16:08:59.268567用户登陆!
2021-11-25 16:09:00.272120用户登陆!
2021-11-25 16:09:01.272749用户登陆!
[2021-11-25 16:09:02,274] songpeilunMacBook-Pro.local/INFO/locust.runners: All users spawned: User: 5 (5 total running)
2021-11-25 16:09:02.274811用户登陆!
2021-11-25 16:09:02.274854浏览商品
2021-11-25 16:09:02.274903浏览商品
2021-11-25 16:09:02.274937浏览商品
2021-11-25 16:09:02.274965浏览商品
2021-11-25 16:09:02.274992浏览商品
2021-11-25 16:09:04.279398浏览商品
2021-11-25 16:09:04.279629浏览商品
2021-11-25 16:09:04.279756浏览商品
2021-11-25 16:09:04.279873浏览商品
2021-11-25 16:09:04.280002浏览商品
2021-11-25 16:09:06.279966浏览商品
2021-11-25 16:09:06.280190浏览商品
2021-11-25 16:09:06.280371浏览商品
2021-11-25 16:09:06.280513浏览商品
2021-11-25 16:09:06.280594浏览商品
2021-11-25 16:09:08.282440支付订单
2021-11-25 16:09:08.282639支付订单
2021-11-25 16:09:08.282741支付订单
2021-11-25 16:09:08.282831支付订单
2021-11-25 16:09:08.282914支付订单
2021-11-25 16:09:10.285356创建订单
2021-11-25 16:09:10.285558创建订单
2021-11-25 16:09:10.285665创建订单
2021-11-25 16:09:10.285755创建订单
2021-11-25 16:09:10.285840创建订单
2021-11-25 16:09:12.290560创建订单
2021-11-25 16:09:12.290785创建订单
2021-11-25 16:09:12.290912创建订单
2021-11-25 16:09:12.291022创建订单
2021-11-25 16:09:12.291130创建订单
2021-11-25 16:09:14.294475退出浏览该商品
2021-11-25 16:09:14.294686退出浏览该商品
2021-11-25 16:09:14.294793退出浏览该商品
2021-11-25 16:09:14.294885退出浏览该商品
2021-11-25 16:09:14.294971退出浏览该商品
2021-11-25 16:09:16.299798退出浏览该商品
2021-11-25 16:09:16.300008退出浏览该商品
2021-11-25 16:09:16.300105退出浏览该商品
2021-11-25 16:09:16.300189退出浏览该商品
2021-11-25 16:09:16.300268退出浏览该商品
[2021-11-25 16:09:17,086] songpeilunMacBook-Pro.local/INFO/locust.runners: Stopping 5 users
[2021-11-25 16:09:17,087] songpeilunMacBook-Pro.local/INFO/locust.runners: 5 Users have been stopped, 0 still running
2021-11-25 16:09:17.087386用户退出
2021-11-25 16:09:17.087482用户退出
2021-11-25 16:09:17.087517用户退出
2021-11-25 16:09:17.087543用户退出
2021-11-25 16:09:17.087566用户退出

LOCUST性能测试3(高并发、参数关联、集合点)相关推荐

  1. Java生鲜电商平台-SpringCloud微服务架构高并发参数优化实战

    Java生鲜电商平台-SpringCloud微服务架构高并发参数优化实战 一.写在前面 在Java生鲜电商平台平台中相信不少朋友都在自己公司使用Spring Cloud框架来构建微服务架构,毕竟现在这 ...

  2. nginx响应高并发参数配置

    一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1.  worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu ...

  3. php fpm最大连接数,PHP最大连接数的设置及php-fpm高并发参数调整

    推荐:<PHP视频教程> 服务器中找到php-fpm.conf配置(有的会在引入的www.conf中)[global] pid = /usr/local/php/var/run/php-f ...

  4. 解决多线程高并发问题常用类

    Volatile关键字 1.volatile解决可见性 //创建一个类继承Thread类 public class MyThread extends Thread{//定义一个共享的静态成员变量,供多 ...

  5. java多线程实例_多线程&高并发(全网最新:面试题+导图+笔记)面试手稳心不慌...

    前言 当你开始开始去跳槽面试的时候,明明只是一份15K的工作,却问你会不会多线程,懂不懂高并发,火箭造得让你猝及不防,结果就是凉凉:现如今市场,多线程.高并发编程.分布式.负载均衡.集群等可以说是现在 ...

  6. Java JUC高并发编程(一)

    目录 一.概述 二.Lock接口 三.线程间的通信 解决虚假唤醒问题 Lock通信示例: 四.线程间定制化通信 一.概述 JUC就是java.util.concurrent工具包的简称,这是一个处理线 ...

  7. pythonlocust使用方法_python locust 性能测试:locust安装和一些参数介绍

    安装参考 https://www.cnblogs.com/fnng/p/6081798.html ps:python3.7暂不支持locust:python3安装建议克隆github上的项目 可能需要 ...

  8. python locust最新版_python locust 性能测试:locust安装和一些参数介绍

    安装参考 https://www.cnblogs.com/fnng/p/6081798.html ps:python3.7暂不支持locust:python3安装建议克隆github上的项目 可能需要 ...

  9. Linux系统高并发kernel参数优化

    众所周知在默认参数情况下Linux对高并发支持并不好,主要受限于单进程最大打开文件数限制.内核TCP参数方面和IO事件分配机制等.下面就从几方面来调整使Linux系统能够支持高并发环境. iptabl ...

最新文章

  1. 【从零开始的ROS四轴机械臂控制】(四)- ros、gazebo与opencv,图像处理节点
  2. php v5.,PHP V5.3 中的新特性,第 5 部分- 从 PHP V5.2 升级到 PHP V5.3
  3. 怎么获得combobox的valueField值
  4. hive中order by,sort by, distribute by, cluster by作用以及用法
  5. android 仿京东toolbar,仿京东商城系列2------自定义toolbar
  6. C语言图形界面的编程
  7. 超经典动态规划题:最大子序和
  8. 83. Leetcode 148. 排序链表 (排序)
  9. linux shell字符串及字符串长度获取方式
  10. js页面传值(注意中文)
  11. PAT乙类1008之数组元素循环右移问题
  12. vue新手开源_开源新手宣布:征集作家
  13. Oracle 11g ADG 配置没问题,但死活不同步案例
  14. python教程视频哪个好-Python教学视频哪个好?老男孩Python培训
  15. Hadoop伪分布式集群环境搭建
  16. 【项目】“头脑王者”答题辅助软件
  17. 为什么你只是产品经理,而总监是总监?
  18. linux 小括号 中括号 双小括号 双中括号
  19. 【路由篇】01. 修改密码 ❀ 1900 ❀ CISCO 路由器
  20. Android开发中三星手机拍照异常处理

热门文章

  1. python extractall函数_Python的内置函数(七)、all()
  2. 将vue打包为APP重要步骤和流程
  3. word树状分支图_肝脏超声声像图表现及常用正常值
  4. 通过不同鞋码计算脚长初次使用while循环
  5. 【重要】2022年“惠普目标检测大赛”邀请通知!(有三AI报名有福利)
  6. 手机如何设置语音信箱
  7. 超好看的UI云开发壁纸小程序源码
  8. php卡片式排版显示,css实现卡片式图片效果
  9. 2021年化工自动化控制仪表及化工自动化控制仪表考试试题
  10. 从win32平台换为x64平台时,_findnext引发的异常中断