- 在VisualStudio中部署GDAL库的C++版本(包括SQLite、PROJ等依赖)
- Android开机流程介绍
- STM32CubeMX教程31USB_DEVICE-HID外设_模拟键盘或鼠标
- 深入浅出Java多线程(五):线程间通信
locust官网介绍:Locust 是一个用于 HTTP 和其他协议的开源性能/负载测试工具。其对开发人员友好的方法允许您在常规 Python 代码中定义测试。Locust测试可以从命令行运行,也可以使用其基于 Web 的 UI 运行。可以实时查看吞吐量、响应时间和错误和/或导出以供以后分析.
1.python 3.7.4 。
2.Locust 2.17(终端可使用pip安装:pip install locust) 。
from locust import TaskSet, between, task, HttpUser class api(TaskSet): @task(1) def on_one(self): data = self.client.post(url="https:.......", json={ "username", "", "password", "" }) print(data.json()) @task(2) def index(self): data = self.client.get("https:..........") print(data.json()) def on_stop(self): print("运行结束") def on_start(self): print("初始化") class UserRun(HttpUser): tasks = [api] wait_time = between(1, 5) # 默认等待时间0s
1)使用locust导入了四个类 。
Taskset:上例中api继承了该类,主要编写一些接口请求信息,client.get(),client.post()表get和post请求.
between:设置每个任务直接等待的间隔,单位为s,例:between(1,5)每个任务直接等待1-5s再去运行。出来between,还有constant可设置固定等待时间,例:constant(5).
task:设置用例权重,数字越大,权重越大,默认为1.
httpuser:定义一个用户的基类,相当于运行类,通过tasks列表来运行我们想要的api。这里写法有两种(例1:tasks=[api1,api2],集合形式,会随机选取一个执行的任务,选取的概率相同。例2:tasks = {api1: 15, api2: 1},字典的形式,数字代表权重,会随机选取一个执行的任务,数字越大,被执行的概率越大).
class UserRun(HttpUser): # tasks = [api] tasks = {api: 15, api_one: 1} wait_time = between(2, 3)
2)上面可以看到api类中有on_start()和on_stop()两个方法,可用来初始化和结束操作 。
1)在终端执行:locust -f python_file_name.py 。
执行后会得到一个http链接,默认ip应该是0.0.0.0。复制url到浏览器打开,如果无法打开的话,就在venv\Lib\site-packages\locust\argument_parser.py下修改默认ip即可.
再次运行会得到http://127.0.0.1:8089的地址,浏览器就可以正常打开了.
Number of users (peak concurrency):总共的用户数 。
Spawn rate (users started/second):每秒启动的用户数 。
1)功能按钮 。
stop:停止运行 。
Reset Stats:重置指标统计 。
2)tab项 。
Statistics:收集的各个指标数据 。
Charts:数据曲线图 。
Failures:请求失败的数据 。
Exceptions:异常请求的数据 。
Current ratio:每个任务的比例 。
Download Data:下载数据csv格式(各项指标,错误数据,异常数据.....) 。
3)Statistics下各指标 。
type:请求类型 name:请求url requests:实际请求数 fails:失败数 median(ms):响应时间的中间值 90%ile(ms):90%响应时间 99%ile(ms):99%响应时间 average(ms):平均响应时间 min(ms):最小响应时间 max(ms):最大响应时间 average size(bytes):平均请求的大小 current rps:当前每秒处理事务的次数 current failures/s:当前每秒的失败数 。
4)Charts数据标 。
Total Requests per Second曲线图:
RPS:每秒请求的次数 。
Pailures/s:每秒失败次数 。
Response Times(ms)曲线图:
50th percentile:50%响应时间 。
95th percentile:95%响应时间 。
Number of Users曲线图:
当前时间请求的用户数 。
1)终端直接输入指令 。
locust -f python_file_name.py --headless --users 1 --spawn-rate 1 --host https://......
--headless:表示无ui模式 。
--users:总共用户数 。
--spawn-rate:表示每秒有多少个用户请求 。
--host:收集接口性能的域名 。
2)收集结果(终端会持续收集,ctrl+c结束) 。
-h | 查看帮助 |
-f | 指定运行文件 |
-h | 指定域名 |
-u | 并发用户数,和--headless一起用 |
-r | 每秒增加多少个用户请求,和--headless一起用 |
-t | 设置运行的时间,不填默认永久 |
-l | 显示可能的用户类列表并退出 |
--web-host | 将 Web 界面绑定到的主机。默认为“*” |
--web-port | 端口,默认8089 |
--headless | 无ui模式 |
--autostart | 立即开始测试(如 --headless,但不禁用 Web UI) |
--autoquit | 在运行 X 秒后完全退出。仅与 --autostart 一起使用 |
--web-auth | Web 界面启用基本身份验证。应该是以下格式提供:用户名:密码 |
--master | 将 locust 设置为在分布式模式下运行,并使用此进程作为主进程 |
--worker | 将 locust 设置为在分布式模式下运行,并使用此 进程作为工作线程 |
--master-host | 分布式locust的主机或IP地址负载测试。仅在使用 --worker 运行时使用。 默认值为 127.0.0.1。 |
-T | 要包含在测试中的标记列表,因此仅包含任务与任何匹配的标签将被执行 |
-E | 要从测试中排除的标签列表,因此仅任务没有匹配的标签将被执行 |
--skip-log-setup | 禁用 Locust 的日志记录设置。取而代之的是,配置由 Locust 测试或 Python 提供 |
--loglevel | 日志等级,在 DEBUG/INFO/WARNING/ERROR/CRITICAL 之间进行选择。默认值为 INFO. |
--logfile | 日志文件的路径。如果未设置,日志将转到 stderr 。 |
--show-task-ratio | 打印用户类的任务执行比率表。如果某些类定义非零fixed_count属性。 |
--version | 查看版本 |
--exit-code-on-error | 设置测试结果时要使用的进程退出代码包含任何故障或错误 。 |
----config | 配置文件路径 |
。
1)单台电脑主要使用cpu核数来实现分布式运行的,打开任务管理器》性能》CPU》内核 查看 。
2)分布式运行存在主从关系,即:master》主,slave》从.
3)编辑好脚本后再终端运行主机(主机主要负责分发任务,具体执行还是从机) 。
locust -f Locusted.py --master
4)再开多个终端运行从机(运行的从机个数要小于等于cpu内核数) 。
locust -f Locusted.py --worker
5)运行问多个从机后,再回到主机的终端,可以看见启动的cpu内核数 。
6)此时浏览器访问http://127.0.0.1:8089可以看见启动的从机数 。
若一台设备不注意满足条件时,可以多台设置同时模拟请求,方法和上面的大致相同,先启动主机 。
locust -f Locusted.py --master
再在其它设置上运行从机(从机环境和主机一致) 。
locust -f Locusted.py --worker --master-host=ip地址
LoadTestShape自定义荷载形状的基类,做负载,首先先继承该类。
from locust import TaskSet, between, task, HttpUser, LoadTestShape, constant class api_one(TaskSet): @task def on_one(self): data = self.client.post(url="/api/teladress?mobile=15161581519", name="测试") print(data.json()) class MyCustomShape(LoadTestShape): time_limit = 60 # 设置负载总运行时长 spawn_rate = 2 # 更改用户数时每秒启动/停止的用户数 def tick(self): run_time = self.get_run_time() # 负载测试的运行时间 if run_time < self.time_limit: user_count = round(run_time, -1) # 当前共增加的用户(当前用户总数) return (user_count, self.spawn_rate) return None class UserRun(HttpUser): tasks = [api_one] host = "https://api.oioweb.cn" # tasks = {api: 15, api_one: 1} wait_time = constant(1)
以上负载测试总共运行60s,每10s增加10个用户,10个用户再5s内增加完成。这里直接介绍tick()方法了,Locust 大约每秒调用一次 tick() 方法。user_count = round(run_time, -1),run_time为当前负载的测试时间,-1表示将run_time四舍五入到最接近的十位数,round(run_time, -1)的取值规则即:0-4.999为0,5-14.999为10,15-24.999为20,依次类推,每十秒增加10个用户。若-1改成-2,即四舍五入到最接近的百位数,每100s增加100个用户.
from locust import TaskSet, between, task, HttpUser, LoadTestShape, constant class api_one(TaskSet): @task def on_one(self): data = self.client.post(url="/api/teladress?mobile=15161581519", name="测试") print(data.json()) class StagesShapeWithCustomUsers(LoadTestShape): # 自定义荷载形状的基类。 # duration:负载的时长,users:用户总数,spawn_rate:每秒启动的用户数 # 0-10s,1s启动10个用户。10-20s,5s启动50个用户,依次类推 stages = [ {"duration": 10, "users": 10, "spawn_rate": 10}, {"duration": 20, "users": 50, "spawn_rate": 10}, {"duration": 30, "users": 100, "spawn_rate": 10}, {"duration": 40, "users": 50, "spawn_rate": 10}, {"duration": 60, "users": 10, "spawn_rate": 10}, ] def tick(self): run_time = self.get_run_time() # 获取负载当前时间 for stage in self.stages: if run_time < stage["duration"]: tick_data = (stage["users"], stage["spawn_rate"]) return None class UserRun(HttpUser): tasks = [api_one] host = "https://api.oioweb.cn" # tasks = {api: 15, api_one: 1} wait_time = constant(1)
运行结果如下 。
。
具体api使用可参考官网:https://docs.locust.io/en/stable/api.html 。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
文章来源:https://www.cnblogs.com/lihongtaoya/ ,请勿转载
。
最后此篇关于locust+python性能测试库的文章就讲到这里了,如果你想了解更多关于locust+python性能测试库的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!