1. 前言
在前面的文章中,我们介绍了性能测试框架Locust是什么:性能专题:Locust工具实战之开篇哲学三问,以及如何安装它:性能专题:Locust工具实战之“蝗虫”降世。
接下来在本篇中,我们通过几则示例为大家展示如何利用Locust来创建性能测试。
在Locust 中没有傻瓜式的脚本录制功能,要想用它来做性能测试,必须撸起袖子来写代码。不过,它并不难!
2. 几个简单的性能脚本示例
Locust里面请求是基于requests的,每个方法请求和requests差不多,请求参数、方法、响应对象和requests一样的使用。
- requests.get 对应client.get
- requests.post 对应client.post
示例1:创建 load_test.py 文件,通过 Python 编写性能测试脚本。
```python #coding=utf-8 from locust import HttpLocust, TaskSet, task # 定义用户行为 class UserBehavior(TaskSet): @task def cnblogs_index(self): self.client.get("/") class WebsiteUser(HttpLocust): task_set = UserBehavior host = "https://www.cnblogs.com" # 被测服务器地址 min_wait = 3000 max_wait = 6000 ```
- UserBehavior类继承TaskSet类,用于描述用户行为。
其中,cnblogs_index() 方法表示一个用户为行,用于访问博客园首页。使用@task装饰该方法为一个事务。client.get()用于指请求的路径“/”,因为是博客园首页,所以指定为根路径。
示例2:
```python # coding=utf-8 import requests from locust import HttpLocust,TaskSet,task from requests.packages.urllib3.exceptions import InsecureRequestWarning # 禁用安全请求警告 requests.packages.urllib3.disable_warnings(InsecureRequestWarning) class MyBlogs(TaskSet): # 访问我的博客首页 @task(1) def get_blog(self): # 定义请求头 header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"} req = self.client.get("/jinjiangongzuoshi", headers=header, verify=False) if req.status_code == 200: print("success") else: print("fails") class websitUser(HttpLocust): task_set = MyBlogs min_wait = 3000 # 单位为毫秒 max_wait = 6000 # 单位为毫秒 if __name__ == "__main__": import os os.system("locust -f load_test.py --host=https://www.cnblogs.com") ```
脚本说明:
1. 首先需要导入locust模块里面的三个方法,HttpLocust,TaskSet,task。
2. 创建一个类继承自TaskSet,表示在这个类里面都是Locust的任务,这个类就算Loucst的任务集,例如新建一个类`MyBlogs(TaskSet)` 或 `UserBehavior(TaskSet)`继承`TaskSet`。
3. 创建任务,其实就是定义一个方法,需要注意的是,这个方法上面多了一个task的装饰器,这个装饰器是用来标是定义的这个方法会被locust识别成它需要做的任务,task装饰器后面会有参数,如果执行单任务的时候,后面这个权重随便写上什么数字都无所谓,这个数字其实就是一个权重值,但是如果有多个任务的情况下,这个时候权重值就会起作用了。
`self.client`调用get和post方法,和`requests`用法一样;
`@task`装饰该方法表示为用户行为,括号里面参数表示该行为的执行权重:数值越大,执行频率越高,不设置默认是1;
举个栗子:
```python @task(1) def index(self): r=self.client.get('/test/index.html') print(r.text) @task(2) def search(self): r=self.client.get('/test/search.html') print(r.text) ```
如有index和search分别设置权重1、2,如果测试时指定30个模拟用户数,那么会有10个模拟用户数执行index任务,有20个模拟用户数执行search任务。
简而言之可以把这个权重理解为执行次数的多少,数值越大,执行的频率就越高。
3. 执行性能测试
1、如果启动的locust文件名为`locustfile.py` 并位于当前工作目录中,可以在编译器中直接运行该文件,或者通过命令行,执行如下命令:
locust --host=https://www.cnblogs.com
2、如果Locust文件位于子目录下且名称不是locustfile.py,可以使用-f命令启动上面的示例locust文件:
locust -f testscript/load_test.py --host=https://www.cnblogs.com
- -f 参数是指定运行的脚本
- --host是指定运行项目的host地址,这里用的https://www.cnblogs.com,代码里面get访问的是"/jinjiangongzuoshi",拼接起来就是完整地址了。
3、如果要运行分布在多个进程中的Locust,通过指定-master以下内容来启动主进程 :
locust -f testscript/load_test.py --master --host=https://www.cnblogs.com
4、如果要启动任意数量的从属进程,可以通过-salve命令来启动locust文件:
locust -f testscript/load_test.py --salve --host=https://www.cnblogs.com
5、如果要运行分布式Locust,必须在启动从机时指定主机(运行分布在单台机器上的Locust时不需要这样做,因为主机默认为127.0.0.1)
locust -f testscript/load_test.py --slave --master-host=192.168.0.100 --host=https://www.cnblogs.com
6、启动locust文件成功后,编译器控制台会显示如下信息:
```shell ➜ Sample git:(master) ✗ locust -f load_test.py --host=https://www.cnblogs.com [2019-12-01 14:31:01,595] zhoujinjiandeMacBook-Pro.local/INFO/locust.main: Starting web monitor at *:8089 [2019-12-01 14:31:01,599] zhoujinjiandeMacBook-Pro.local/INFO/locust.main: Starting Locust 0.9.0 ```
8089是该服务启动的端口号,如果是本地启动,可以直接在浏览器输入http://localhost:8089打开UI界面,如果是其他机器搭建locust服务,则输入该机器的IP+端口即可。
4. Locust Web界面模式
Locust默认使用该方式启动,启动后在本机打开http://localhost:8089/,可以看到Locust WEB页面,设置并发用户数及每秒请求数后即可开始性能测试。
- Number of users to simulate:设置模拟的用户总数。
- Hatch rate (users spawned/second):每秒启动的虚拟用户数。
- Start swarming:开始运行性能测试。
输入并发数、每秒生成的用户数,然后点击“Start swarming”开始执行压测,执行过程中,随着并发用户数逐渐增多,向设定的目标并发数靠近,达到目标值后并发数则不再继续增加。
PS:点击STOP可以停止locust脚本运行。
- Type:请求类型,即接口的请求方法;
- Name:请求路径;
- requests:当前已完成的请求数量;
- fails:当前失败的数量;
- Median:响应时间的中间值,即50%的响应时间在这个数值范围内,单位为毫秒;
- Average:平均响应时间,单位为毫秒;
- Min:最小响应时间,单位为毫秒;
- Max:最大响应时间,单位为毫秒;
- Content Size:所有请求的数据量,单位为字节;
- reqs/sec:每秒钟处理请求的数量,即QPS;
各模块说明:
- New test:点击该按钮可对模拟的总虚拟用户数和每秒启动的虚拟用户数进行编辑;
- Statistics:类似于jmeter中Listen的聚合报告;
- Charts:测试结果变化趋势的曲线展示图,分别为每秒完成的请求数(RPS)、响应时间、不同时间的虚拟用户数;
- Failures:失败请求的展示界面;
- Exceptions:异常请求的展示界面;
- Download Data:测试数据下载模块, 提供三种类型的CSV格式的下载,分别是:Statistics、responsetime、exceptions;
5. Locust 命令行无界面模式
Locust也可使用no-web命令行模式,使用命令如下:
locust -f load_test.py --host=https://www.cnblogs.com --no-web --csv=locust -c 10 -r 2 -t 1m
启动参数:
- --no-web 表示不使用Web界面运行测试,使用no-web模式。
- -c 设置虚拟用户数,即并发用户数。
- -r 设置每秒启动虚拟用户数,即每秒请求数。
- -t 或--run_time,设置设置运行时间。
- --csv 表示运行结果文件名。
未完待续~
细心的读者也许会发现,仅凭这篇文章的性能示例用法介绍,是很难直接应用到真实的项目性能实施中,本篇主要还是想通过基础示例,让大家对Locust开展性能测试能先有一个直观的认识,真实项目实施过程,会涉及到更复杂的知识点,我们将在后续为大家介绍。