性能测试使用locust进行接口的性能测试(一)
Posted 黑黑白白君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了性能测试使用locust进行接口的性能测试(一)相关的知识,希望对你有一定的参考价值。
前置知识:
《【性能测试】性能测试基础》
《【接口测试实战(零)】接口测试简介》
文章目录
1)接口性能测试
1.1常见指标:
-
QPS(Queries Per Second,每秒查询率):
是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。- 在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。对应fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。
*QPS VS. TPS
TPS:Transactions Per Second(每秒传输的事物处理个数),即服务器每秒处理的事务数。
- TPS包括一条消息入和一条消息出,加上一次用户数据库访问。(业务TPS = CAPS × 每个呼叫平均TPS)
- TPS是软件测试结果的测量单位。
- 一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程:客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。
- 一般的,评价系统性能均以每秒钟完成的技术交易的数量来衡量。系统整体处理能力取决于处理能力最低模块的TPS值。
区别:Qps基本类似于Tps,但是不同的是,对于一个页面的一次访问,形成一个Tps;但一次页面请求,可能产生多次对服务器的请求,服务器对这些请求,就可计入“Qps”之中。
- 例如:访问一个页面会请求服务器3次,一次放,产生一个“T”,产生3个“Q”
-
RT(Reaction Time,响应时间):
指系统对请求作出响应的时间。- 在讨论一个系统的响应时间时,人们通常是指该系统所有功能的平均时间或者所有功能的最大响应时间。当然,往往也需要对每个或每组功能讨论其平均响应时间和最大响应时间。
一个系统的吞吐量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联。单个reqeust对CPU消耗越高,外部系统接口、IO影响速度越慢,系统吞吐能力越低,反之越高。
- 一个系统吞吐量通常由QPS(TPS)、并发数两个因素决定,每套系统这两个值都有一个相对极限值,在应用场景访问压力下,只要某一项达到系统最高值,系统的吞吐量就上不去了,如果压力继续增大,系统的吞吐量反而会下降,原因是系统超负荷工作,上下文切换、内存等等其它消耗导致系统性能下降。
-
并发数(系统同时处理的request/事务数):
- 并发数 = QPS*平均响应时间
- 或者,QPS(TPS)= 并发数/平均响应时间
- 注意:并发用户数与每秒的并发请求数不同,前者是同一时间内向服务器发送请求的用户数量。所以一定要确认需求的目的是并发用户数还是并发请求数。
-
资源利用率:
在一定负载下,服务器资源占用情况。不是越小越好,如果资源利用率太小,会造成资源的浪费。
- CPU利用率:一般不允许超过70-80%,需要考虑队列长度。
- Mem利用率:一般80%以下,也考虑页交换频率(虚拟内存和物理内存之间交换的频繁程度)。
- 带宽利用率:服务器的带宽利用率。
2)Locust入门级使用
2.1 Locust是什么
Locust 是一个开源负载测试工具。使用 Python 代码定义用户行为,也可以仿真百万个用户。
- 是非常简单易用的、分布式的用户负载测试工具,官网:https://locust.io/
- 主要为网站或者其他系统进行负载测试,能测试出一个系统可以并发处理多少用户。
- Locust 是完全基于时间的,因此单个机器支持几千个并发用户。相比其他许多事件驱动的应用,Locust 不使用回调,而是使用轻量级的处理方式 gevent(一个基于 greenlet 的 Python 的并发框架,以微线程greenlet为核心,使用了epoll事件监听机制以及诸多其他优化而变得高效)。
2.2 Locust的安装
- 在mac上安装,python版本用的是3.9
1、安装locust,安装命令:pip3 install locust
。安装完之后,使用locust –-help
这个命令查看是否安装成功。
2、简单使用,查看安装效果(本次安装的是locust 1.6.0版本):
创建load_test.py文件,通过Python编写性能测试脚本。
from locust import HttpUser, TaskSet, task
class UserBehavior(TaskSet): # 创建UserBehavior()类继承TaskSet类,为用户行为
@task(1) # 用@task()装饰该方法为一个任务,1表示一个Locust实例被挑选执行的权重,数值越大,执行频率越高
def baidu(self): # 创建baidu() 方法表示一个行为,访问百度首页
self.client.get("/")
class WebsiteUser(HttpUser): # WebsiteUser()类用于设置性能测试
tasks = [UserBehavior] # 指向一个定义了的用户行为类
min_wait = 3000 # 用户执行任务之间等待时间的下界,单位:毫秒
max_wait = 6000 # 用户执行任务之间等待时间的上界,单位:毫秒
*参考其他人代码时出现了两个问题:
- 关于HttpLocust的报错,解决方法:将脚本中引用的所有HttpLocust都改为HttpUser
- 关于User.task_set的报错,解决方法:将task_set = UserBehavior 修改为 tasks = [UserBehavior]
解决方法参考自:https://blog.csdn.net/DaisyCold/article/details/108261611
3、切换到性能测试脚本所在的目录,启动这个python脚本,其中:load_test.py 为测试脚本,https://www.baidu.com 为测试的网站。
…/> locust -f load_test.py –host=https://www.baidu.com
4、打开浏览器访问:http://127.0.0.1:8089:
2.3 写一个locust脚本
locustfile 是一个普通的 python 文件,唯一的要求是它至少声明一个从类 User 继承的类。
- User类(用户类):一个用户类代表一个用户(如果你愿意,也可以代表一群蝗虫)。 Locust 将为每个被模拟的用户生成一个 User 类的实例。 User 类可以定义一些通用属性。
- 用户的 wait_time 方法是一个可选属性,用于确定模拟用户在执行任务之间应等待多长时间。 如果没有指定wait_time,一个新的任务一完成就会执行。
- weight attribute(权重属性):如果文件中存在多个用户类,并且没有在命令行中指定用户类,Locust 将生成相同数量的每个用户类。
- 主机属性(host attribute):主机属性是要加载的主机的 URL 前缀(即“http://google.com”)。 通常,这是在 Locust 的 Web UI 或命令行中指定的,在 locust 启动时使用 --host 选项。
- 任务属性(tasks attribute):User 类可以使用 @task 装饰器将任务声明为它的方法,但也可以使用 tasks 属性指定任务。
当负载测试开始时,将为每个模拟用户创建一个 User 类的实例,并且他们将开始在自己的green thread中运行。 当这些用户运行时,他们选择他们执行的任务,睡一会儿,然后选择一个新任务等等。
- 这些任务是普通的 Python 可调用程序,如果我们对拍卖网站进行负载测试,它们可以执行诸如“加载起始页”、“搜索某些产品”、“出价”等操作。
- 为用户添加任务的最简单方法是使用任务装饰器@task 。@task 接受一个可选的权重参数,可用于指定任务的执行率。
- 另一种定义用户任务的方法是设置任务属性。tasks 属性要么是一个 Task 列表,要么是一个 <Task : int> dict,其中 Task 要么是一个 python 可调用类,要么是一个 TaskSet 类。 如果任务是一个普通的 python 函数,它们会收到一个参数,即正在执行任务的 User 实例。
- 通过使用@tag 装饰器标记任务,可以使用–tags 和–exclude-tags 参数对测试期间执行的任务进行挑选。
-
HttpUser类
HttpUser 是最常用的 User。 它添加了一个用于发出 HTTP 请求的client属性。- client 是 HttpSession 的一个实例,可用于向我们要进行负载测试的目标系统发出 HTTP 请求。
- HttpSession 是 requests.Session 的子类/包装器,因此它的功能有很好的文档记录。 HttpSession 增加的主要是将请求结果上报到 Locust 中(成功/失败、响应时间、响应长度、名称)。
- client 包含所有 HTTP 方法的方法:get、post、put、… 就像 requests.Session 一样,它在请求之间保留 cookie,因此可以轻松地用于登录网站。
- HttpSession 捕获 Session 抛出的任何 requests.RequestException(由连接错误、超时或类似原因引起),而不是返回一个 status_code 设置为 0 且内容设置为 None 的虚拟 Response 对象。
- client 是 HttpSession 的一个实例,可用于向我们要进行负载测试的目标系统发出 HTTP 请求。
-
验证响应:
如果 HTTP 响应代码正常(<400),则认为请求成功,但对响应进行一些额外验证通常很有用。- 可以使用 catch_response 参数、with 语句和对 response.failure() 的调用将请求标记为失败
- 还可以将请求标记为成功,即使响应代码是错误的
-
创建请求:
- 生成GET请求的例子:可见上面
- 生成POST请求的例子:
-
带json的POST请求:
res = self.client.post("/login", json={"username":"foo", "password":"bar"})
-
【部分内容参考自】
- TPS和QPS的区别和理解:https://www.huaweicloud.com/articles/0ba1ab1bf63d24b5e74391cc6eb0efc4.html
- 什么是QPS,TPS,吞吐量:https://www.jianshu.com/p/2fff42a9dfcf
- Locust的安装(mac安装):https://blog.csdn.net/Y12nre/article/details/80356070
- https://docs.locust.io/en/stable/writing-a-locustfile.html#writing-a-locustfile
以上是关于性能测试使用locust进行接口的性能测试(一)的主要内容,如果未能解决你的问题,请参考以下文章
性能测试工具 wrk,ab,locust,Jmeter 比较