Python语言的locust接口性能测试
性能测试工具
性能工具首先想到的是Loadrunner或Jmeter,LoadRunner是非常有名的商业性能测试工具,功能非常强大,但不推荐使用该工具,使用比较复杂,工具体积比较大,付费价格不便宜.
Locust简介
基于Python语言,采用纯Python描述测试脚本,并且HTTP请求完全基于Requests库,除HTTP/HTTPS协议外,Locust还可以测试其他协议的系统,只需采用Python调用对应的库进行请求描述即可,Locust的并发机制摒弃了进程和线程,采用协程的机制,协程避免了系统级资源调度,因此可以大幅度提高单机的并发能力.
Locust的常规使用
安装 pip install locust
针对开发的接口 https://api.apiopen.top/getJoke?page=1&count=2&type=video
负载场景
- 每秒生成2个用户,总共生成60个用户
- 负载测试5分钟然后查看接口的平均响应时间
from locust import HttpUser, task, between
class QuickstartUser(HttpUser):
wait_time = between(5, 9)
# 测试新实时段子 https://api.apiopen.top/getJoke?page=1&count=2&type=video
@task
def view_item(self):
page = 1
count = 2
type = "video"
self.client.get(f"/getJoke?page={page}&count={count}&type={type}")分解解释:
- 模拟用户定义一个类,继承自HttpUser的client属性,从而为每个用户提供一个属性,该属性是一个实例HttpSession,可用于像要加载测试的目标系统发出HTTP请求
- 类中定义了一个wait_time函数,该函数将使模拟用户在每个任务执行后等待5-9秒
- 通过修饰两个方法来声明两个任务@task() 传入参数在选择任务的时候,传入2表示有2倍的选择任务机会,越大倍数越高
- 此外还声明了on_start方法,每个模拟用户在启动时,都会调用具有该名称的方法
- 如果将测试代码放在当前目录下的locustfile.py,直接运行locust就会执行该测试用例;如果在其他目录位置,使用locust -f 文件绝对路径
locust的页面解释
首页
- Number of users to simulate 设置模拟用户数
- Hatch rate(users spawned/second) 每秒产生的虚拟用户数
- 但是Start swarming 开始运行性能测试
测试报告页
- Type 请求的类型
- Name 请求的路径
- request 当前请求的数量
- fails 当前请求失败的数量
- Median 中间值
- Average 平均值,所有请求的平均响应时间
- Min 请求的最小服务器响应时间
- Max 请求的额最大服务器响应时间
- Content Size 单个请求的大小,单位字节
- reqs/sec 每秒中请求的个数
- 点击Charts菜单可以查看性能图表
locust的分解教程
wait_time属性
用于确定模拟用户在执行任务之间等待多长时间
最常见的是between,模拟用户在每次执行任务后等待介于最小值和最大值之间的随机时间,其他内置的等待时间函数时constant和constant_pacing wait_time=between(5,15)
weight属性
如果文件存在多个用户类,并且希望模拟更多特定类型的用户,则可以在这些类上设置一个weight属性,比如WebUser可能是MobileUser的三倍
class WebUser(User): weight = 3 ... class MobileUser(User): weight = 1 ...
主机属性
一般在locust启动时或者命令行中执行该选项指定(locust -f 绝对路径 --host="https://ww.w.baidu.com")
如果在用户类中声明了主机属性,则--host在命令行货web请求中未指定任何主机属性的情况下将使用该属性
on_start和on_stop方法
用户和TaskSet类可以声明一个on_start方法或on_stop方法,用法跟selenium中setup、setdown用法类似
- on_start 在开始运行时将调用它的方法,对于TaskSet,on_start方法在模拟用户开始执行时被调用
- on_stop 在停止运行时调用它的方法
test_start和test-stop事件
如果需要在负载测试的呃开始或结束时运行一些代码,则使用test_start和test_stop事件,可以在locustfile的模块级别为这些事件设置侦听器
from locust import events @events.test_start.add_listener def on_test_start(**kwargs): print("A new test is starting") @events.test_stop.add_listener def on_test_stop(**kwargs): print("A new test is ending")
使用http客户端
HttpUser的每个实例在client属性中都有一个实例,在HttpSession类实际上是一个子类ruquest.Session,可以用来做HTTP请求,将使用报告给用户get、post、put、delete、head、patch和options方法
在没有UI的情况下运行locust
希望在某种自动化流程运行locust,结合headless标志与-u和-r一起使用
locust -f locust_files/my_locust_file.py --headless -u 1000 -r 100
设置测试时间限制(一旦时间到,locust将关闭)
locust -f locust_files/my_locust_file.py --headless -u 1000 -r 100 --run-time 1h30m
通过更快的HTTP客户端提高Locust的性能
子类FastHttpUser而不是HttpUser(需要注意的是FastHttpUser使用具有稍微不同的API的其他客户端实现,所以它可能并不总是可以替代HttpUser。)
from locust import task, between from locust.contrib.fasthttp import FastHttpUser class MyUser(FastHttpUser): wait_time = between(2, 5) @task def index(self): response = self.client.get("/")