Python Locust性能测试框架实践

简介: [本文出自天外归云的博客园] Locust的介绍 Locust是一个python的性能测试工具,你可以通过写python脚本的方式来对web接口进行负载测试。 Locust的安装 首先你要安装python2.6以上版本,而且有pip工具。

[本文出自天外归云的博客园]

Locust的介绍

Locust是一个python的性能测试工具,你可以通过写python脚本的方式来对web接口进行负载测试。

Locust的安装

首先你要安装python2.6以上版本,而且有pip工具。之后打开命令行,分别安装locustio和pyzmq(命令如下):

pip install locustio
pip install pyzmq

之后我们就可以写性能测试脚本了。

PS:如果是python3,不能使用pip安装目前。需要在github上下载locust项目包到本地,然后在包路径下执行命令安装:

python setup.py install

Locust脚本编写

接下来我们拿两个接口做一下测试,编写脚本如下(每一步都有注释)。我来解释一下,首先我们要import进来三个类,分别是HttpLocust(用来模拟发请求的类)、TaskSet(顾名思义,任务集)、task(任务类)。额外的,为了方便观察接口测试的执行结果,我引入了json类用来解析web接口的返回值。我还引入了subprocess类用来执行一下shell命令,自启动Locust。这里有三个类,一个是UserBehavior(名字随便起,但传入TaskSet参数,说明这是一个包含了任务集的类),里面on_start函数可有可无,他会先于所有task函数运行。剩下被@task装饰器装饰的方法都是任务方法,里面包含了待请求的接口等信息,传入的参数代表了权重,如下所示两个被@task装饰的方法分别传入1和2,这意味着每3个人里有两个人会有1个模拟用户执行list_header方法,2个模拟用户执行list_goods方法。这个参数你也可以不传入,那就意味着模拟用户会随机访问所有被@task装饰的方法。这里面我对于每个接口的返回值都做了一下判断,首先将返回的字符串转成json格式并获取返回字段result的值,如果不是100就用Locust自带的报错方法打印出错信息;另两个类是HttpLocust类(仍然是名字随便起但传入参数必须得是HttpLocust),是用来模拟用户的类,包含了一些模拟用户信息,其中task_set变量的值用来指定模拟用户所对应要完成的TaskSet类中包含的请求,min_wait和max_wait(最小等待时间和最大等待时间用来模拟用户每两步操作之间的间隔时间,这里也就是模拟用户每执行两个请求之间所间隔的时间)。对Locust类我们可以指定权重,对weight变量的值进行指定。如下所示,两个Locust类的权重分别为1和3,这意味着两个Locust类的模拟用户人数为1:3的关系。最后我加了一个main函数用来执行shell命令,这个shell命令也可以不再本文件中执行,如果写在脚本中的话,直接在命令行中调用该python文件即可,如果不写在脚本中(注释掉最后两行),则需要在命令行终端里对Locust项目进行启动。

from locust import HttpLocust,TaskSet,task
import subprocess
import json

#This is the TaskSet class.
class UserBehavior(TaskSet):
    #Execute before any task.
    def on_start(self):
        pass

    #the @task takes an optional weight argument.
    @task(1)
    def list_header(self):
        r = self.client.get("/homepage/list_header.html")
        if json.loads((r.content))["result"] != 100:
            r.failure("Got wrong response:"+r.content)

    @task(2)
    def list_goods(self):
        r = self.client.get("/homepage/list_goods.html")
        if json.loads((r.content))["result"] != 100:
            r.failure("Got wrong response:"+r.content)

#This is one HttpLocust class.
class WebUserLocust(HttpLocust):
    #Speicify the weight of the locust.
    weight = 1
    #The taskset class name is the value of the task_set.
    task_set = UserBehavior
    #Wait time between the execution of tasks.
    min_wait = 5000
    max_wait = 15000

#This is another HttpLocust class.
class MobileUserLocust(HttpLocust):
    weight = 3
    task_set = UserBehavior
    min_wait = 3000
    max_wait = 6000

#if __name__ == '__main__':
#    subprocess.Popen('locust -f .\locust_test_1.py --host=http://api.g.caipiao.163.com', shell=True)

Locust的启动

对Locust项目的启动,我们可以在命令行终端中执行以下命令:

locust -f .\locust_test_1.py --host=http://api.g.caipiao.163.com

这里的“-f”指定了要执行的python文件路径,“--host”指定了模拟用户请求接口的host名。执行该命令,Locust项目就启动了。如果遇到下面的错误,注意[Errorno 10048]那行,可以看出端口8089被占用导致Locust项目启动失败,这里我们需要找到对应占用了8089端口的进程并杀掉:

为了检测占用端口的进程我写了一个PowerShell小脚本:

function checkPid($result,$port){
    $port = $port.split(":")[1]
    if(($result.split())[6].split(":")[($result.split())[6].split(":").Count-1] -eq $port){
        $tPid = ($result.split())[($result.split()).count-1]
        if($tPid -ne "0"){
            Write-Host "您查询的端口被以下程序占用:" -ForegroundColor Red
            $target = tasklist|findstr $tPid
            Write-Host $target
            $sig = $true
        }else{
            $sig = $false
        } 
    }else{
        $sig = $false
    }
    $sig
}
function checkPort($port){
    $port = ":" + $port
    $results = netstat -ano|findstr $port
    if($results.count -gt 0){
        if($results.count -eq 1){
            $sig = checkPid $results $port
            if($sig -eq $false){
                Write-Host "您所查询的端口未被占用!" -ForegroundColor Green
            }
        }else{
            foreach($result in $results){
                if($result){
                   $sig = checkPid $result $port
                   if($sig -eq $true){
                       break
                   }
                }
            }
            if($sig -eq $false){
                Write-Host "您所查询的端口未被占用!" -ForegroundColor Green        
            }
        }
    }else{
        Write-Host "您所查询的端口未被占用!" -ForegroundColor Green
    }
}
$port = $null
while($port -ne "exit()"){
    $port = Read-Host "请输入要查询的端口号"
    if($port -eq "exit()"){
        break
    }
    checkPort $port
}

运行该脚本,输入端口号8089我们可以看出python.exe进程占用了该端口号:

然后我们在PowerShell中杀掉该进程,再启动Locust项目,就成功了(如下):

接下来就可以在浏览器中访问我们的locust页面来完成负载测试了,如果不想通过浏览器来设置完成负载测试,纯粹命令行模式也是支持的,输入以下命令:

locust -f .\locust_test_1.py --host='http://api.winyyg.com' --no-web -c 1000 -r 10 -n 1000

接下来负载测试就会自动执行,按“ctrl+c”结束负载测试:

对于命令行中的参数的解释:--no-web是用来选择无浏览器模式,-c后面接的是模拟用户数,-r后面接的每秒模拟用户并发数,-n后面接的是模拟请求数。

Locust负载测试

在浏览器中输入“http://localhost:8089/”访问,会看到如下页面:

这里我们按提示输入要模拟的用户总数和每秒钟并发的用户数量,点击“Start swarming”就可以运行负载测试了:

点击“STOP”按钮停止负载测试,现在STATUS为“STOPPED”,点击“New test”可以进行一个新的测试:

从上图可以看出在Statistics标签下列出了一些性能相关的测试结果,比如总的请求数量、请求失败的个数、每秒钟的请求数、最小\最大响应时间、平均响应时间等。右上角显示了请求失败率和总的RPS(每秒钟请求数)。对应在Statistic右侧的Failures、Exceptions、Download Data标签下我们分别可以查看失败的请求、捕获的异常以及下载测试结果。这里不做过多介绍了,可以实际应用看一下。如果想深入的了解Locust性能测试框架,去官网上看看吧。

相关文章
|
2月前
|
存储 Java 数据处理
(numpy)Python做数据处理必备框架!(一):认识numpy;从概念层面开始学习ndarray数组:形状、数组转置、数值范围、矩阵...
Numpy是什么? numpy是Python中科学计算的基础包。 它是一个Python库,提供多维数组对象、各种派生对象(例如掩码数组和矩阵)以及用于对数组进行快速操作的各种方法,包括数学、逻辑、形状操作、排序、选择、I/0 、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟等等。 Numpy能做什么? numpy的部分功能如下: ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环)。 用于读写磁盘数据的工具以及用于操作内存映射文件的工具。 线性代数、随机数生成以及傅里叶变换功能。 用于集成由C、C++
344 0
|
3月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
368 1
|
2月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
277 0
|
2月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
442 0
|
2月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
185 0
|
2月前
|
SQL 安全 Linux
Metasploit Pro 4.22.8-20251014 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.8-20251014 (Linux, Windows) - 专业渗透测试框架
161 1
Metasploit Pro 4.22.8-20251014 (Linux, Windows) - 专业渗透测试框架
|
2月前
|
Linux 网络安全 iOS开发
Metasploit Framework 6.4.95 (macOS, Linux, Windows) - 开源渗透测试框架
Metasploit Framework 6.4.95 (macOS, Linux, Windows) - 开源渗透测试框架
208 1
Metasploit Framework 6.4.95 (macOS, Linux, Windows) - 开源渗透测试框架
|
2月前
|
存储 数据采集 监控
Python定时爬取新闻网站头条:从零到一的自动化实践
在信息爆炸时代,本文教你用Python定时爬取腾讯新闻头条,实现自动化监控。涵盖请求、解析、存储、去重、代理及异常通知,助你构建高效新闻采集系统,适用于金融、电商、媒体等场景。(238字)
369 2
|
3月前
|
安全 Linux 网络安全
Metasploit Pro 4.22.8-2025091701 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.8-2025091701 (Linux, Windows) - 专业渗透测试框架
308 2
Metasploit Pro 4.22.8-2025091701 (Linux, Windows) - 专业渗透测试框架
|
3月前
|
Linux 网络安全 iOS开发
Metasploit Framework 6.4.90 (macOS, Linux, Windows) - 开源渗透测试框架
Metasploit Framework 6.4.90 (macOS, Linux, Windows) - 开源渗透测试框架
417 1
Metasploit Framework 6.4.90 (macOS, Linux, Windows) - 开源渗透测试框架

推荐镜像

更多