Locust接口性能测试

本文详细介绍了Locust,一个基于Python的轻量级性能测试工具,与传统工具如LoadRunner和JMeter相比,Locust更易用、并发能力强且支持分布式测试。作者通过实例展示了如何在Locust中进行性能测试,包括配置、参数化和分布式运行的步骤。
摘要由CSDN通过智能技术生成

谈到性能测试工具,我们首先想到的是LoadRunner或JMeter。LoadRunner是非常有名的商业性能测试工具,功能非常强大。但现在一般不推荐使用该工具来进行性能测试,主要是使用也较为复杂,而且该工具体积比较大,需要付费且价格不便宜。

JMeter同样是非常有名的开源性能测试工具,功能也很完善,我们之前介绍了它作为接口测试工具的使用。

Locust同样是性能测试工具,虽然官方这样来描述它:“An open source load testing tool.”,但它和前面两个工具有一些不同。

Locust简介

Locust完全基于Python编程语言,采用纯 Python描述测试脚本,并且HTTP请求完全基于Requests库。除了HTTP/HTTPS协议外,Locust还可以测试其他协议的系统,只需采用Python调用对应的库进行请求描述即可。

LoadRunner和JMeter这类采用进程线程的测试工具,都很难在单机上模拟出较高的并发压力。Locust的并发机制摒弃了进程和线程,采用协程(gevent)的机制。协程避免了系统级资源调度,因此可以大幅提高单机的并发能力。

下载安装

官网地址:https://www.locust.io

使用pip命令安装Locust:

pip install locustio

安装完成之后检测是否安装成功:

 
  1. C:\Users\Shuqing>locust -help

  2. Usage: locust [options] [LocustClass [LocustClass2 ... ]]

  3. Options:

  4. -h, --help show this help message and exit

  5. -H HOST, --host=HOST Host to load test in the following format:

  6. http://10.21.32.33

  7. --web-host=WEB_HOST Host to bind the web interface to. Defaults to '' (all

  8. interfaces)

  9. -P PORT, --port=PORT, --web-port=PORT

  10. Port on which to run web host

  11. -f LOCUSTFILE, --locustfile=LOCUSTFILE

  12. Python module file to import, e.g. '../other.py'.

  13. Default: locustfile

  14. ....

测试案例

测试场景

针对如下两个接口进行性能测试:

 
  1. http://127.0.0.1:8000/users/

  2. http://127.0.0.1:8000/groups/

以上两个接口也就是我们之前项目django_restful的接口

负载场景

  • 每秒生成2个用户,总共生成60个用户。
  • 负载测试5分钟然后查看接口的平均响应时间。
脚本实现

restful_api_locust.py

 
  1. from locust import HttpLocust,TaskSet,task

  2. class UserBehavior(TaskSet):

  3. @task(2)

  4. def test_users(self):

  5. self.client.get("/users/",auth=('51zxw','zxw20182018'))

  6. @task(1)

  7. def test_groups(self):

  8. self.client.get("/groups/",auth=('51zxw','zxw20182018'))

  9. class WebsiteUser(HttpLocust):

  10. task_set = UserBehavior

  11. min_wait = 3000

  12. max_wait = 6000

UserBehavior类继承TaskSet类,用于描述用户行为。

  • @task装饰该方法为一个事务,后面的数字表示请求比例,上面的比例为2:1 默认都是1:1
  • test_users()方法表示一个用户行为,这里是请求user接口。
  • test_groups()方法表示请求group接口。
  • client.get()用于指定请求的路径。

WebsiteUser类用于设置性能测试。

  • task_set:指向一个定义的用户行为类。
  • min_wait:执行事务之间用户等待时间的下界(单位:毫秒)。
  • max_wait:执行事务之间用户等待时间的上界(单位:毫秒)。
执行测试

使用如下命令开始启动测试

 
  1. C:\Users\Shuqing>locust -f D:\api_test\locust\restful_api_locust.py --host=http://127.0.0.1:8000

  2. [2018-07-24 15:39:22,917] LAPTOP-8B5JADC8/INFO/locust.main: Starting web monitor at *:8089

  3. [2018-07-24 15:39:22,917] LAPTOP-8B5JADC8/INFO/locust.main: Starting Locust 0.8.1

在浏览器打开localhost:8089可以看到如下页面:

  • Number of users to simulate:设置模拟用户数。
  • Hatch rate(users spawned/second):每秒产生(启动)的虚拟用户数。
  • 单击“Start swarming”按钮,开始运行性能测试

运行之后可以看到主界面如下:

性能测试参数如下。

  • Type:请求的类型,例如GET/POST。
  • Name:请求的路径。
  • request:当前请求的数量。
  • fails:当前请求失败的数量。
  • Median:中间值,单位毫秒,一半的服务器响应时间低于该值,而另一半高于该值。
  • Average:平均值,单位毫秒,所有请求的平均响应时间。
  • Min:请求的最小服务器响应时间,单位毫秒。
  • Max:请求的最大服务器响应时间,单位毫秒。
  • Content Size:单个请求的大小,单位字节。
  • reqs/sec:每秒钟请求的个数。

点击 Charts 菜单可以查看性能图表

图表含义如下:

  • Total Request per Second :每秒的请求数
  • Average Response Time: 平均响应时间
  • Number of Users: 用户数

参数化

测试场景

如果想对如下接口进行并发测试,则可以将id进行参数化设置

 
  1. http://127.0.0.1:8000/groups/1/

  2. http://127.0.0.1:8000/groups/2/

  3. http://127.0.0.1:8000/users/1/

  4. http://127.0.0.1:8000/users/2/

代码实现

locust_users_groups.py

 
  1. from locust import HttpLocust,TaskSet,task

  2. class UserBehavior(TaskSet):

  3. def on_start(self):

  4. #设置user和group参数下标初始值

  5. self.users_index=0

  6. self.groups_index=0

  7. @task

  8. def test_users(self):

  9. #读取参数

  10. users_id=self.locust.id[self.users_index]

  11. url="/users/"+str(users_id)+'/'

  12. self.client.get(url,auth=('51zxw','zxw20182018'))

  13. #取余运算循环遍历参数

  14. self.users_index=(self.users_index+1)%len(self.locust.id)

  15. @task

  16. def test_groups(self):

  17. #参数化

  18. groups_id=self.locust.id[self.groups_index]

  19. url="/groups/"+str(groups_id)+"/"

  20. self.client.get(url,auth=('51zxw','zxw20182018'))

  21. self.groups_index=(self.groups_index+1)%len(self.locust.id)

  22. class WebsiteUser(HttpLocust):

  23. task_set = UserBehavior

  24. #参数配置

  25. id=[1,2]

  26. min_wait = 3000

  27. max_wait = 6000

  28. #host配置

  29. host = 'http://127.0.0.1:8000'

运行结果

执行如下命令即可运行测试

C:\Users\Shuqing>locust -f D:\api_test\locust\locust_users_groups.py

运行模式

no-web运行

前面是通过登录web来运行测试的,其实也可以非web状态来运行,如cmd命令来运行。如果需要非Web形式运行,则需使用--no-web参数,并会用到如下几个参数。

  • -c, --clients:指定并发用户数;
  • -r, --hatch-rate:指定并发加压速率,默认值位1。
  • -t, --run-time:设置运行时间。如(300s,20m, 3h, 1h30m等);

运行命令如下:

locust -f D:\api_test\locust\locust_users_groups.py --no-web -c 10 -r 2 -t 15s

运行结果如下:

 
  1. C:\Users\Shuqing>locust -f D:\api_test\locust\locust_users_groups.py --no-web -c 10 -r 2 -t 15s

  2. [2018-08-21 10:12:59,017] LAPTOP-8B5JADC8/INFO/locust.main: Run time limit set to 15 seconds

  3. [2018-08-21 10:12:59,017] LAPTOP-8B5JADC8/INFO/locust.main: Starting Locust 0.8

  4. [2018-08-21 10:12:59,018] LAPTOP-8B5JADC8/INFO/locust.runners: Hatching and swarming 10 clients at the rate 2 clients/s...

  5. Name # reqs # fails Avg Min Max | Median req/s

  6. --------------------------------------------------------------------------------------------------------------------------------------------

  7. --------------------------------------------------------------------------------------------------------------------------------------------

  8. Total 0 0(0.00%) 0.00

  9. Name # reqs # fails Avg Min Max | Median req/s

  10. --------------------------------------------------------------------------------------------------------------------------------------------

  11. GET /groups/1/ 2 0(0.00%) 134 122 146 | 120 0.00

  12. GET /users/1/ 2 0(0.00%) 118 100 136 | 100 0.00

  13. --------------------------------------------------------------------------------------------------------------------------------------------

  14. Total 4 0(0.00%) 0.00

  15. Name # reqs # fails Avg Min Max | Median req/s

  16. --------------------------------------------------------------------------------------------------------------------------------------------

  17. GET /groups/1/ 4 0(0.00%) 135 122 146 | 130 1.00

  18. GET /users/1/ 4 0(0.00%) 115 100 136 | 100 1.00

  19. --------------------------------------------------------------------------------------------------------------------------------------------

  20. Total 8 0(0.00%) 2.00

  21. [2018-08-21 10:13:04,034] LAPTOP-8B5JADC8/INFO/locust.runners: All locusts hatched: WebsiteUser: 10

  22. [2018-08-21 10:13:04,034] LAPTOP-8B5JADC8/INFO/locust.runners: Resetting stats

  23. Name # reqs # fails Avg Min Max | Median req/s

  24. --------------------------------------------------------------------------------------------------------------------------------------------

  25. GET /groups/1/ 1 0(0.00%) 147 147 147 | 150 0.00

  26. GET /users/1/ 2 0(0.00%) 110 92 128 | 92 0.00

  27. GET /users/2/ 1 0(0.00%) 102 102 102 | 100 0.00

  28. --------------------------------------------------------------------------------------------------------------------------------------------

  29. Total 4 0(0.00%) 0.00

  30. Name # reqs # fails Avg Min Max | Median req/s

  31. --------------------------------------------------------------------------------------------------------------------------------------------

  32. GET /groups/1/ 3 0(0.00%) 129 101 147 | 140 0.00

  33. GET /users/1/ 3 0(0.00%) 108 92 128 | 100 0.00

  34. GET /users/2/ 1 0(0.00%) 102 102 102 | 100 0.00

  35. --------------------------------------------------------------------------------------------------------------------------------------------

  36. Total 7 0(0.00%) 0.00

  37. Name # reqs # fails Avg Min Max | Median req/s

  38. --------------------------------------------------------------------------------------------------------------------------------------------

  39. GET /groups/1/ 4 0(0.00%) 125 101 147 | 110 1.00

  40. GET /groups/2/ 2 0(0.00%) 136 116 156 | 120 0.00

  41. GET /users/1/ 3 0(0.00%) 108 92 128 | 100 1.00

  42. GET /users/2/ 2 0(0.00%) 102 102 102 | 100 0.33

  43. --------------------------------------------------------------------------------------------------------------------------------------------

  44. Total 11 0(0.00%) 2.33

  45. Name # reqs # fails Avg Min Max | Median req/s

  46. --------------------------------------------------------------------------------------------------------------------------------------------

  47. GET /groups/1/ 5 0(0.00%) 123 101 147 | 120 0.75

  48. GET /groups/2/ 3 0(0.00%) 124 100 156 | 120 0.50

  49. GET /users/1/ 3 0(0.00%) 108 92 128 | 100 0.75

  50. GET /users/2/ 4 0(0.00%) 114 102 153 | 100 0.25

  51. --------------------------------------------------------------------------------------------------------------------------------------------

  52. Total 15 0(0.00%) 2.25

  53. Name # reqs # fails Avg Min Max | Median req/s

  54. --------------------------------------------------------------------------------------------------------------------------------------------

  55. GET /groups/1/ 6 0(0.00%) 128 101 157 | 120 0.67

  56. GET /groups/2/ 5 0(0.00%) 127 100 156 | 120 0.33

  57. GET /users/1/ 4 0(0.00%) 108 92 128 | 100 0.50

  58. GET /users/2/ 5 0(0.00%) 121 102 153 | 100 0.50

  59. --------------------------------------------------------------------------------------------------------------------------------------------

  60. Total 20 0(0.00%) 2.00

  61. [2018-08-21 10:13:13,691] LAPTOP-8B5JADC8/INFO/locust.main: Time limit reached. Stopping Locust.

  62. [2018-08-21 10:13:13,693] LAPTOP-8B5JADC8/INFO/locust.main: Shutting down (exit code 0), bye.

  63. Name # reqs # fails Avg Min Max | Median req/s

  64. --------------------------------------------------------------------------------------------------------------------------------------------

  65. GET /groups/1/ 6 0(0.00%) 128 101 157 | 120 0.67

  66. GET /groups/2/ 5 0(0.00%) 127 100 156 | 120 0.33

  67. GET /users/1/ 4 0(0.00%) 108 92 128 | 100 0.50

  68. GET /users/2/ 5 0(0.00%) 121 102 153 | 100 0.50

  69. --------------------------------------------------------------------------------------------------------------------------------------------

  70. Total 20 0(0.00%) 2.00

  71. Percentage of the requests completed within given times

  72. Name # reqs 50% 66% 75% 80% 90% 95% 98% 99% 100%

  73. --------------------------------------------------------------------------------------------------------------------------------------------

  74. GET /groups/1/ 6 140 140 150 150 160 160 160 160 157

  75. GET /groups/2/ 5 120 150 150 160 160 160 160 160 156

  76. GET /users/1/ 4 110 110 130 130 130 130 130 130 128

  77. GET /users/2/ 5 100 150 150 150 150 150 150 150 153

  78. --------------------------------------------------------------------------------------------------------------------------------------------

  79. Total 20 120 140 150 150 160 160 160 160 157

分布式运行

上面我们都是单台机器来执行性能测试,但是当单台机器不够模拟足够多的用户时,Locust支持运行在多台机器中进行压力测试。分布式运行一般是一台master 多台slave 如下图所示:

首先定义一台 master

  1. C:\Users\Shuqing>locust -f D:\api_test\locust\locust_users_groups.py --master

然后定义 slave

C:\Users\Shuqing>locust -f D:\api_test\locust\locust_users_groups.py  --slave

如果slavemaster不在同一台机器上,还需要通过--master-host参数再指定master的IP地址。

C:\Users\Shuqing>locust -f D:\api_test\locust\locust_users_groups.py --slave --master-host <master_ip>

运行之后可以看到web界面显示的SLAVES数量

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

  • 25
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值