代码讲解
上一篇文章《初探Locust》,让我们了解了Locust,现在我们就可以开始实战了。
在《初探Locust》中,我们已经完成了性能测试的登录代码,现在我们开始完善业务代码,来讲解Locust,代码如下:
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
"""
@File:ConcurrentLogin.py
@Description: 描述
@Author:yeqinfang
@Email:yeqinfang@yeah.net
@Date: 2020/07/30
"""
import random
import json
from locust import HttpUser, task, between, HttpLocust
# from common.globalToken import oneToken
class QuickstartUser(HttpUser):
wait_time = between(5, 9)
@task
def getpretrainedmodel(self):
url = "/getpretrainedmodel"+"?index=0&limit=1"
headers = {}
headers["Authorization"] = "Bearer " + getattr(QuickstartUser, "adminLoginToken")
res = self.client.request(method="GET", url=url, headers=headers)
# print(res.text)
@task(3)
def testlabeltaskimg(self):
url = "/testlabeltaskimg"
headers = {}
headers["Authorization"] = "Bearer " + getattr(QuickstartUser, "adminLoginToken")
data = {
'taskid': 'label_edge_admin_20200713105112',
'istest': '1',
'testids': 'label_edge_admin_20200713105112_2016,label_edge_admin_20200713105112_2015,label_edge_admin_20200713105112_2014,label_edge_admin_20200713105112_2013,label_edge_admin_20200713105112_2012,label_edge_admin_20200713105112_2011,label_edge_admin_20200713105112_2010,label_edge_admin_20200713105112_2009,label_edge_admin_20200713105112_2008,label_edge_admin_20200713105112_2007,label_edge_admin_20200713105112_2006,label_edge_admin_20200713105112_2005,label_edge_admin_20200713105112_2004,label_edge_admin_20200713105112_2003,label_edge_admin_20200713105112_2002,label_edge_admin_20200713105112_2001,label_edge_admin_20200713105112_2000,label_edge_admin_20200713105112_1999,label_edge_admin_20200713105112_1998,label_edge_admin_20200713105112_1997'
}
res = self.client.request(method="POST", url=url, data=data, headers=headers)
# print(res.text)
def on_start(self):
url = "/logintp"
data = {
"user": "admin",
"pwd": "12345678"
}
res = self.client.post(url=url, data=data)
# print(res.text)
setattr(QuickstartUser, "adminLoginToken", json.loads(res.text)["data"]["token"])
if __name__ == '__main__':
pass
代码中涉及一些模块,详解如下:
1、HttpUser:
如代码所示,我们定义了一个类,它继承了HttpUser,用于模拟用户。HttpUser为每个用户提供了一个客户端属性,这是一个HttpSession的实例,可用于向我们想要加载测试的目标系统发出HTTP请求。当测试开始时,locust将为它模拟的每个用户创建这个类的实例。
2、between:
我们的类使用between定义了一个wait_time函数,它将使模拟用户在执行每个任务后等待5到9秒。
3、task:
2个接口通过@task来装饰, 其中一个带上参数3,将被连续执行3次。任务不分先后顺序,如果定义了wait_time函数,他们只会在任务间间隔这些时间,而不是同一任务中(如代码的某个任务被执行三次,不会间隔这个时间)。任务将会不断被执行,只要不去手动停止。
4、self.client.request
该方法是基于模块requests的,因此request的用法跟requests.request一样。
上面的代码,实现了登录后,对某些接口进行的请求。
命令行工具
locust是一个命令行工具,想要运行上面的代码,可以通过该命令行运行,运行方式如下:
locust --web-host 10.12.1.82 --web-port 1234 -f D:360MoveDataUserslenovoDesktopTengine2_AutoTestScriptPerformance-TrainingConcurrentLogin.py
–web-host : 指定运行的IP
–web-port :指定运行的端口
-f :指定运行的性能脚本
还有其他使用的参数,后续用到再讲解。
图形界面
命令行运行程序后,通过自定义的端口访问,10.12.1.82:1234 ,打开如下:
在Locust中,用Python代码定义用户行为。然后使用locust命令及其web界面(可选)生成和模拟大量这些用户,同时收集请求统计信息。
如上,模拟用户数,指的是对一个接口请求的并发数量;每秒生成用户数,指的是每秒产生的用户,慢慢地往上增加,直到达到并发数量为止。也就是,假设模拟用户数为1000,每秒生成用户数为1,那么1000秒后,才有每次并发1000用户去请求接口。
如上图,定义了用户数,每秒生成数和测试地址。建议通过Google打开(IE内核的浏览器是打不开的),输入相关数据,即可开始测试,并图形查看测试过程: