









1. 介绍
它是一个开源性能测试工具。使用 Python 代码来定义用户行为。用它可以模拟百万计的并发用户访问你的系统。

LoadRunner 是非常有名的商业性能测试工具,功能非常强大。使用也比较复杂,目前大多介绍性能测试的书籍都以该工具为基础,甚至有些书整本都在介绍 LoadRunner 的使用。
Jmeter 同样是非常有名的开源性能测试工具,功能也很完善,在本书中介绍了它作为接口测试工具的使用。但实际上,它是一个标准的性能测试工具。关于Jmeter相关的资料也非常丰富,它的官方文档也很完善。
Locust 同样是性能测试工具,虽然官方这样来描述它 “An open source load testing tool.” 。但其它和前面两个工具有着较大的不同。相比前面两个工具,功能上要差上不少,但它也并非优点全无。
正是基于这样的特点,使我选择使用Locust工具来做性能测试,另外一个原因是它可以让我们换一种方式认识性能测试,可能更容易看清性能测试的本质。
我想已经成功的引起了你的兴趣,那么接下来就跟着来学习Locust的使用吧。
Locust 是基于 Python 语言的一个性能测试库,如果要想使用它来做性能测试必须要先安装 Python 。
python3.6 版本安装(略)
方式一:通过 pip 命令安装
最后,检查是否安装成功。命令窗口,输入 “locust --v” 查看版本

创建一个locustfile.py 脚本文件
UserBehavior类继承TaskSet类,用于描述用户行为。
baidu_index() 方法表示一个用户为行,访问百度首页。
使用@task装饰该方法为一个事务。client.get()用于指请求的路径“/”,因为是百度首页,所以指定为根路径。
WebsiteUser类用于设置性能测试。
通过浏览器访问:http://127.0.0.1:8089(Locust启动网络监控器,默认为端口号为: 8089)

设置模拟用户数。
设置孵化率 每秒产生(启动)的虚拟用户数。
点击 “启动” 按钮,开始运行性能测试。

性能测试参数分析
在Locust类中,具有一个client属性,它对应着虚拟用户作为客户端所具备的请求能力,也就是我们常说的请求方法。通常情况下,我们不会直接使用Locust类,因为其client属性没有绑定任何方法。因此在使用Locust时,需要先继承Locust类,然后在继承子类中的client属性中绑定客户端的实现类。
对于常见的HTTP(S)协议,Locust已经实现了HttpLocust类,其client属性绑定了HttpSession类,而HttpSession又继承自requests.Session。因此在测试HTTP(S)的Locust脚本中,我们可以通过client属性来使用Python requests库的所有方法,包括GET/POST/HEAD/PUT/DELETE/PATCH等,调用方式也与requests完全一致。另外,由于requests.Session的使用,因此client的方法调用之间就自动具有了状态记忆的功能。常见的场景就是,在登录系统后可以维持登录状态的Session,从而后续HTTP请求操作都能带上登录态。
而对于HTTP(S)以外的协议,我们同样可以使用Locust进行测试,只是需要我们自行实现客户端。在客户端的具体实现上,可通过注册事件的方式,在请求成功时触发events.request_success,在请求失败时触发events.request_failure即可。然后创建一个继承自Locust类的类,对其设置一个client属性并与我们实现的客户端进行绑定。后续,我们就可以像使用HttpLocust类一样,测试其它协议类型的系统。
在Locust类中,除了client属性,还有几个属性需要关注下:
task_set: 指向一个TaskSet类,TaskSet类定义了用户的任务信息,该属性为必填;max_wait/min_wait: 每个用户执行两个任务间隔时间的上下限(毫秒),具体数值在上下限中随机取值,若不指定则默认间隔时间固定为1秒;host:被测系统的host,当在终端中启动locust时没有指定--host参数时才会用到;weight:同时运行多个Locust类时会用到,用于控制不同类型任务的执行权重。测试开始后,每个虚拟用户(Locust实例)的运行逻辑都会遵循如下规律:
WebsiteTasks中的on_start(只执行一次),作为初始化;WebsiteTasks中随机挑选(如果定义了任务间的权重关系,那么就是按照权重关系随机挑选)一个任务执行;Locust类中min_wait和max_wait定义的间隔时间范围(如果TaskSet类中也定义了min_wait或者max_wait,以TaskSet中的优先),在时间范围中随机取一个值,休眠等待;2~3步骤,直至测试任务终止。一个Locust实例被挑选执行的权重,数值越大,执行频率越高。在一个 locustfile.py 文件中可以同时定义多个 HttpLocust 子类,然后分配他们的执行权重,例如:
然后在终端启动测试:
性能测试工具要模拟用户的业务操作,就需要通过脚本模拟用户的行为。在前面的比喻中说到,TaskSet类好比蝗虫的大脑,控制着蝗虫的具体行为。
具体地,TaskSet类实现了虚拟用户所执行任务的调度算法,包括规划任务执行顺序(schedule_task)、挑选下一个任务(execute_next_task)、执行任务(execute_task)、休眠等待(wait)、中断控制(interrupt)等等。在此基础上,我们就可以在TaskSet子类中采用非常简洁的方式来描述虚拟用户的业务测试场景,对虚拟用户的所有行为(任务)进行组织和描述,并可以对不同任务的权重进行配置。
在TaskSet子类中定义任务信息时,可以采取两种方式,@task装饰器和tasks属性。
采用@task装饰器定义任务信息时,描述形式如下:
采用tasks属性定义任务信息时,描述形式如下:
在如上两种定义任务信息的方式中,均设置了权重属性,即执行test_job2的频率是test_job1的两倍。
若不指定执行任务的权重,则相当于比例为1:1。
A:
B:
在TaskSet子类中除了定义任务信息,还有一个是经常用到的,那就是on_start函数。这个和LoadRunner中的vuser_init功能相同,在正式执行测试前执行一次,主要用于完成一些初始化的工作。例如,当测试某个搜索功能,而该搜索功能又要求必须为登录态的时候,就可以先在on_start中进行登录操作HttpLocust使用到了requests.Session,因此后续所有任务执行过程中就都具有登录态了。
TaskSequence类是一个TaskSet,但它的任务将按顺序执行。要定义此顺序,您应该执行以下操作:
在上面的示例中,顺序被定义为执行first_task,然后执行second_task,最后执行third_task 10次。如您所见,您可以@seq_task使用@task装饰器进行组合,当然您也可以在TaskSequences中嵌套TaskSet,反之亦然。
子目录可以是一种更清晰的方法(参见下面的示例),但是locust只会导入相对于放置运行的locustfile的目录的模块。如果您希望从项目根目录(即运行locust命令的位置)导入,请确保sys.path.append(os.getcwd())在导入任何公共库之前写入您的locust文件 - 这将使项目成为root(即当前正在工作)目录)可导入。
项目根
__init__.pycommon/
__init__.pyconfig.pyauth.pylocustfiles/
__init__.pyweb_app.pyapi.pyecommerce.py使用上述项目结构,您的locust文件可以使用以下命令导入公共库:
用于在请求之间执行Web请求和保留(会话)cookie的类(以便能够登录和退出网站)。记录每个请求,以便蝗虫可以显示统计信息。
每个发出请求的方法还需要两个额外的可选参数,这些参数是特定于Locust的,并且在python-requests中不存在。这些是:
request(方法,网址,名称=无,catch_response = False,** kwargs )
构造并发送一个requests.Request。返回requests.Response对象。
| 参数: |
|
|---|
性能测试也需要设置断言么? 某些情况下是需要,比如你在请求一个页面时,就可以通过状态来判断返回的 HTTP 状态码是不是 200。
catch_response = True :布尔类型,如果设置为 True, 允许该请求被标记为失败。
通过 client.get() 方法发送请求,将整个请求的给 response, 通过 response.status_code 得请求响应的 HTTP 状态码。如果不为 200 则通过 response.failure('Failed!') 打印失败!
在某些请求中,需要携带之前从Server端返回的参数,因此在构造请求时需要先从之前的Response中提取出所需的参数。
所有并发虚拟用户共享同一份测试数据,并且保证虚拟用户使用的数据不重复。
例如,模拟3用户并发注册账号,要求注册账号不重复,注册完毕后结束测试;
HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。
在 HttpRunner 安装成功后,系统中会新增如下 5 个命令:
httprunner、hrun、ate 三个命令完全等价,功能特性完全相同,个人推荐使用hrun命令。
运行如下命令,若正常显示版本号,则说明 HttpRunner 安装成功。
使用Chrome或者火狐浏览器,打开要访问的API,同时使用打开开发工具【网络】,查看接口请求状态

选中接口请求,右键导出保存为HAR格式文件,假设导出的文件名称为 demo-quickstart.har。
为了简化测试用例的编写工作,HttpRunner 实现了测试用例生成的功能。
首先,需要将抓取得到的数据包导出为 HAR 格式的文件,如:名称为 demo-quickstart.har。
然后,在命令行终端中运行如下命令,即可将 demo-quickstart.har 转换为 HttpRunner 的测试用例文件。
使用 har2case 转换脚本时默认转换为 JSON 格式,加上 -2y 参数后转换为 YAML 格式。两种格式完全等价,YAML 格式更简洁,JSON 格式支持的工具更丰富,大家可根据个人喜好进行选择
经过转换,在源 demo-quickstart.har 文件的同级目录下生成了相同文件名称的 YAML 格式测试用例文件 demo-quickstart.yml,其内容如下:
现在我们只需要知道如下几点:
如上便是 HttpRunner 测试用例的基本结构。
demo-quickstart.json
运行测试用例的命令为hrun,后面直接指定测试用例文件的路径即可。
执行性能测试使用locusts 命令执行,
进阶使用参考官方文档:
https://cn.httprunner.org/
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。