原文链接:https://mp.weixin.qq.com/s/9PxSPuHmucSLi_welq6uNQ

现在性能测试工具太多,根据业务不同使用,比如说我们熟悉的loadrunner、jmeter、ab、webbench等等,这些工具是也主流大部分也在使用,但是如果你能看懂python代码,会写就更好了,可以根据自已的业务编写,不会自己写框架也可以尝试一下今天的主角Locust,一款基于python的开源性能测试工具,主要也是负载测试工具,它的优点是学习起来比较简单,功能完全自定制,自由控制业务逻辑,使用比较灵活,支持分布式。

它主要就是模拟一群用户将访问你的后台。每个用户的行为由你编写的python代码定义,同时可以从Web界面中实时观察到用户的行为。

Locust完全是事件驱动的,因此在单台机器上能够支持几千并发用户访问。

与其它许多基于事件的应用相比,Locust并不使用回调,而是使用gevent,而gevent是基于协程的,可以用同步的方式来编写异步执行的代码。每个用户实际上运行在自己的greenlet中。

所有的性能测试工具都至少包含这3方面:

   1、压力产生器,也就是可以指定产生多大的压力,多少并发;

   2、数据统计,也就是结果的展示,要统计TPS【QPS】是多少,响应时间多少等等,这些数据; 

   3、代理功能,代理功能简单来说就4个字,分摊压力:如说你压测的时候要用1000个并发,但是你的电脑(压力机)配置比较弱,只支持500并发,再大电脑就死掉了,完犊子,压测不了。那怎么办呢,就得分摊压力,从其他服务器发压力,那就可以了,每台服务器上500个并发,人多好干活嘛,代理就是干这个的,把这个上面的压力分摊到别的电脑上。

当然今天的主角Locust这3个功能都是有的,locust的官网是 www.locust.io,有详细的文档查看。

Locust其实是python的一个第三方模块,安装很简单,直接pip install locust即可,或者自己下载安装包,手动安装。安装完成后,就有locust命令,在命令行里面输入 locust --help,有帮助信息就安装成功了。

如何用呢,很简单,只需要几行代码就可以实现,并且有漂亮的web界面也可用命令行执行,可以设置并发数,和查看结果,当然缺点也是有的,就是没有资源利用率统计,需自行在被测服务器中监控。

先写几行简单的代码,写一个打开BestTest首页的脚本。

from locust import HttpLocust, TaskSet, task

HttpLocust 这个类的作用是用来发送http请求的

TaskSet 这个类是定义用户行为的,相当于loadrunnerhttp协议的脚本,jmeter里面的http请求一样,要去干嘛的

task 这个task是一个装饰器,它用来把一个函数,装饰成一个任务,也可以指定他们的先后执行顺序

class BestTest(TaskSet):

自己定义的类,继承TaskSet,也就是这个类是实现咱们要去请求什么的

@task#用task装饰器把这个函数装饰成一个咱们要执行的性能任务

def index(self):#这个函数里面定义的是咱们要具体做的操作

self.client.get('/')#请求这个url里面的哪个路径,如果是接口的话,就是哪个接口

class BestTestIndexUser(HttpLocust):

这个类继承了HttpLocust,代表每个并发里面的每个用户

task_set = BestTest #这个是每个用户都去干什么,指定了BestTest这个类,它就会每个用户去运行besttest这个类里面的方法

if name == "main":

import os

os.system("locust -f ./load_test.py --host=https://mp.weixin.qq.com/s/rhjKkj7pKpLX0YtbKOZxew")

或者注释掉程序入口代码,直接命令行执行下面

locust -f besttest.py --host=https://mp.weixin.qq.com/s/rhjKkj7pKpLX0YtbKOZxew

-f是指定一个python文件 后面跟上咱们刚才写的python文件

--host是你要访问哪个后台,后面跟的url

默认端口号8090,启动locust:运行完之后,访问的时候用ip:8090就可以访问了.

locust控制台页面:

开始测试后的页面:

tps图和响应时间图:

刚才上面写的例子是单个接口压测, 或者更说单场景的,如果想做混合场景的压测。

只需要写多个task就可以了,也就是在类里面写多个函数,想谁想执行,标上数字就行了,1,2,3,4代码如下:

不同类型的模拟用户

1.考虑一种测试场景:如果我们想测试前端用户登录和详情,需要并发100个人,并且使其中10个人登录,另外90个人在详情页瞎逛,用locust框架应该如何实现呢?框架的命令行有提示locust [options] [LocustClass [LocustClass2 ...]]

当我们使用框架运行一个测试脚本时,如果脚本中只有一个Locust类,则框架会以这个类作为模拟用户的模板;如果该脚本中不止一个Locust类,则需要指定类名;如果需要模拟多种类型的用户,则可以指定多个类名,框架会根据每个Locust类的权重分配模拟用户的比例(默认权重为10)。

一个简单示例如下:

from locust import TaskSet, HttpLocust, task, TaskSequence, seq_task, InterruptTaskSet

class LoginTaskSet(TaskSet):

@task

def login(self):

print("登录")

class DetailsTaskSet(TaskSet):

@task

def details(self):

print("详情页")

class UserOwn(HttpLocust):

weight = 10

task_set = LoginTaskSet

host = "https://mp.weixin.qq.com/s/rhjKkj7pKpLX0YtbKOZxew"

min_wait = 10000

max_wait = 10000

class UserTwo(HttpLocust):

weight = 90

task_set = DetailsTaskSet

host = "https://mp.weixin.qq.com/s/rhjKkj7pKpLX0YtbKOZxew"

min_wait = 10000

max_wait = 10000

命令行运行:locust -f ***.py UserOwn UserTwo

如果并发10人,就会有1人在登录,9人在详情页瞎逛了,业务是自己编的

2.TaskSet的tasks属性

定义任务的方式,就是在TaskSet类中定义一个方法,并标注其为@task;另一个定义任务的方式就是使用TaskSet的tasks属性,这个属性值可以是数组或字典,其中表示的任务可以是一个函数,也可以是另一个TaskSet。如果使用数组,其元素可以是元组(callable, int),int值即为该任务的权重。

2.1函数

示例中的tasks = [(play_one, 5), play_two]与tasks = {play_one: 5, play_two: 1}是完全等价的。tasks中的函数和有注解@task的函数有同等的地位,都是这个TaskSet的一个基本单位。

函数需有一个参数表示self

def test_one(self):

print("test_one")

def test_two(self):

print("test_two")

class TestTaskSet(TaskSet):

tasks = [(test_one, 5), test_two]

@task

def test(self):

print("the test is me")

class TestTwo(HttpLocust):

weight = 90

task_set = TestTaskSet

host = "https://mp.weixin.qq.com/s/rhjKkj7pKpLX0YtbKOZxew"

min_wait = 100

max_wait = 100

2.2嵌套TaskSet

tasks属性的元素也可以是另一个TaskSet,这种做法就会形成嵌套的子任务。例如:我们测试前端,需要每一个用户在详情页瞎逛的时候,有1/10的概率进入详情页进行另外的操作,详情页逛完退回主页继续闲逛,示例如下:

class TestTaskSet(TaskSet):

tasks = [test_one, test_two]

@task(5)

def test_details(self):

print("the details is Wandering")

@task

def end_details(self):

print("details end")

self.interrupt()

class TestOutTaskSet(TaskSet):

tasks = {TestTaskSet: 1}

@task(9)

def Test_out(self):

print("the details is out")

当进入嵌套的任务集执行任务后,会根据嵌套任务集的任务权重执行任务,除非调用self.interrupt()或抛出中断异常raise InterruptTaskSet否则将一直在子任务集中执行下去

3.内部类

还有一种实现嵌套子任务的方式是使用内部类,如上诉示例,等同于:

class TestOutTaskSet(TaskSet):

@task(9)

def Test_out(self):

print("the details is out")

@task

class TestTaskSet(TaskSet):

tasks = [test_one, test_two]

   @task(5)
def test_details(self):
print("the details is Wandering") @task
def end_details(self):
print("details end")
self.interrupt()

4.类的继承

如果一个TaskSet的父类是另一个TaskSet,那么父类的所有任务会同样的成为子类的任务。

5.最后尾声

Locust类是创建模拟用户的模板,所以如果我们要使用不同的角色进行测试时,就需要给框架提供不同的Locust类。TaskSet类是模拟需要执行的任务集,我觉得可以这么理解,这是一个任务的池子,里面的每个单位都是一个任务,这个任务可以是函数也可以是另一个TaskSet,这个任务的定义方式有几个(当前TaskSet通过@task定义,继承父类的任务,tasks属性中一个元素),但它们都是同等地位的,执行的概率与它们的权重相同,每一次模拟用户都会从这个池子里挑选任务进行执行(直到stop_timeout或页面点击Stop)。当挑选到一个类型为TaskSet的任务执行时,就进入了嵌套的子任务当中,相当于到了子任务的池子里开始挑选任务执行(直到调用self.interrupt()或抛出中断异常raise InterruptTaskSet)。

好用的python性能测试神器–Locust的更多相关文章

  1. Python 3.6 性能测试框架Locust安装及使用

    背景 Python3.6 性能测试框架Locust的搭建与使用 基础 python版本:python3.6 开发工具:pycharm Locust的安装与配置 点击“File”→“setting” 点 ...

  2. 性能测试工具Locust

    An open source load testing tool. 一个开源性能测试工具. define user behaviour with python code, and swarm your ...

  3. Python3.6 性能测试框架Locust的搭建与使用

    背景 Python3.6 性能测试框架Locust的搭建与使用 基础 python版本:python3.6 方法一: pip install locustio 方法二: 开发工具:pycharm 使用 ...

  4. 性能测试工具Locust,一个开源性能测试工具

    性能测试工具Locust,一个开源性能测试工具使用Python代码来定义用户行为.用它可以模拟百万计的并发用户访问你的系统.1.它与目前主流的LoadRunner和Jmeter玩法都不一样.2.它完全 ...

  5. 性能测试进阶:(一)性能测试工具Locust

    An open source load testing tool. 一个开源性能测试工具. define user behaviour with python code, and swarm your ...

  6. 性能测试框架Locust初学笔记

    Locust初探 Locust是一款类似于Jmeter开源负载测试工具,所不同的是它是用python实现,并支持python脚本. locust提供web ui界面,能够方便用户实时监控脚本运行状态. ...

  7. Python 三大神器

    Python 三大神器 Python 中有很多优秀的包,本文主要讲一下 pip, virtualenv, fabric 1. pip 用来包管理 文档:https://pip.pypa.io/en/l ...

  8. [django]python异步神器-celery

    python异步神器celery https://segmentfault.com/a/1190000007780963

  9. 性能测试工具locust简单应用

    简介 Locust是一种易于使用的分布式用户负载测试工具.可用于对网站(或系统)负载测试,并依据响应数据计算出系统支持的并发用户数. 安装及调试(以下操作在windows环境下进行) Locust基于 ...

随机推荐

  1. 二、Vue基础语法

    六:Vue的v-bind指令作用:绑定标签上的所有属性其简写 ":" 6.1:    例如:<p v-bind:id="test">Hello wo ...

  2. 面向对象(OO)第二阶段学习总结

    0.前言 此阶段总共进行三次大作业,其中第一次作业中的第一题,水文数据校验及处理中,遇到较大的难题,第一次接触正则表达式,编码过程中显得难度特别大.第二次作业同样也是对于一元多项式求导中对单项的正则校 ...

  3. 6.Python中内存是如何管理的?

    Python中内存是如何管理的? Python memory is managed by Python private heap space. All Python objects and data ...

  4. Hard filters (by GATK)

    Filter Symbol T. Definition QualByDepth QD 2.0 The variant confidence (from the QUAL field) divided ...

  5. python 多进程处理 multiprocessing模块

    前提: 有时候一个用一个进程处理一个列表中的每个元素(每个元素要传递到一个函数中进行处理),这个时候就要用多进程处理 1 现场案例: 我有一个[ip1,ip2,ip3,.......]这样的列表,我要 ...

  6. INTERVIEW #5

    笔试 150min,3题,每题100分,自己果然还是个蒟蒻呢~ 最近状态好差,虽然做了一些题,但还是考得稀烂,大概有几点需要加强: 独立做题,不要一边看板子一边写代码,更不要一开始就看题解: 对之前研 ...

  7. Leetcode2 两数相加 Python

    给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...

  8. pyhton中绘制多个图像

    1,在python的图像学习中,有时我们需要在同一个窗口中,显示多个图像,方便我们查看输出图像的区别. 2,在pycharm中,导入matplotlibmokuai,据说此模块来自matlab,因为没 ...

  9. 70行实现Promise核心源码

    70行实现Promise核心源码 前言: ​ 一直以来都是只会调用Promise的API,而且调API还是调用axios封装好的Promise,太丢人了!!!没有真正的去了解过它的原理是如何实现的,自 ...

  10. IoTClient开发6 - S7-200SmarTcp协议客户端实现

    环境和工具 服务端电脑IP:192.168.1.130 客户端电脑IP:192.168.1.120 1.在服务端电脑运行IoTClientTool 2.运行Wireshark 3.在客户端电脑运行Io ...