前言:说起性能测试,大家想到的基本上都是工具jmeter和loadrunner多少也对执行性能测试的方式有一点认识,这些工具基本都实现了请求-响应-结果统计分析这样完整的测试链路,用户方面只需组织这些现成的插件即可实现性能测试过程,但是这些都不是对python友好的工具,对于python系用户来说不能用python接入和封装是一件很让人扫兴的事情,“Locust是使用Python语言编写实现的开源性能测试工具,简洁、轻量、高效,并发机制基于gevent协程,可以实现单机模拟生成较高的并发压。

那么什么是Locust呢?翻译过来就是蝗虫,支持Python 2.7、3.4、3.5和3.6。

理论:

1、Locust是一个易于使用,分布式,用户负载测试工具。它旨在测试web站点(或其他系统)的负载测试,并计算系统能够处理多少并发用户。在测试期间,我们定义一群蝗虫会攻击你的网站,每个蝗虫(或者测试用户)的行为是由您定义的,集群过程是由web UI实时监控的。

这将帮助您在允许真正的用户进入之前进行测试并识别代码中的瓶颈。蝗虫完全是基于事件的,因此可以在一台机器上支持数千个并发用户。与其他许多基于事件的应用程序不同,它不使用回调。相反,它通过gevent使用轻量级过程。每个蝗虫都在自己的进程中运行(正确地说,是绿色的)。这允许我们在Python中编写非常有表现力的场景,而不用回调使代码变得复杂。

2、用普通的Python编写用户测试场景不需要笨拙的ui或膨胀的xml,只需像通常那样编写代码即可。基于coroutines而不是回调,代码看起来和行为都像正常的,阻塞Python代码。分布式和可伸缩—支持成千上万的用户,蝗虫支持在多台机器上运行负载测试。由于基于事

件,即使一个Locust节点也可以在一个进程中处理数千个用户。这背后的部分原因是,即使您模拟了那么多用户,也不是所有用户都在积极地攻击您的系统。通常,用户都不知道下一步该做什么。每秒请求数!=在线用户数。基于web的UILocust有一个简洁的HTML+JS用户界面,实时显示相关的测试细节。由于UI是基于web的,所以它是跨平台的,易于扩展。可以测试任何系统尽管蝗虫是面向web的,但它几乎可以用来测试任何系统。只要写一个客户,不管你想测试什么,用蝗虫攻击它!这是超级简单!打算保持这种状态。所有繁重的任务都被委派给gevent。其他测试工具的脆弱性是开发者创建蝗虫的原因。

3、 locust产生是因为开发者厌倦了现有的解决办法。他们都没有解决正确的问题,没有抓住要点,他们之前尝试了Apache JMeter和Tsung。这两种工具都可以使用,我们在工作中多次使用过前者。JMeter有一个UI,你可能会认为它是一件好事。但是,您很快就会意识到,通过一些点单击界面“编码”测试场景是一个PITA。其次,JMeter是线装书。这意味着对于您想要模拟的每个用户,您都需要一个单独的线程。不用说,在一台机器上对成千上万的用户进行基准测试是不可行的。另一方面,Tsung并没有这些线程问题,因为它是用Erlang编写的。它可以利用光束本身提供的重量轻的过程,并愉快地放大。但是在定义测试场景时,Tsung和JMeter一样有限。它提供了一个基于xml的DSL来定义用户在测试时的行为。完成时显示任何类型的图形或报告都需要我们对测试生成的日志文件进行后期处理。只有这样,你才能了解测试是如何进行的。不管怎样,他们在创造蝗虫的时候已经试图解决这些问题。

一、安装:

1、Locust在PyPI上可用,可以通过pip或easy_install安装:pip install locustio

2、查看Locust可用选项:locust --help

3、在Windows上安装蝗虫在Windows上,运行pip安装locustio应该可以工作。但是,如果没有,很有可能可以通过首先为pyzmq、gevent和greenlet安装预构建的二进制包来修复它。下载地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/,当你下载了.whl文件后,你 可以通过以下命令安装:pip install name-of-file.whl

补充知识点:增加打开文件的最大数量限制机器上的每个HTTP连接都打开一个新文件(技术上是一个文件描述符)。操作系统可以为可打开的文件的最大数量设置一个低限制。如果限制小于测试中模拟用户的数量,就会发生故障。将操作系统的默认最大文件数量限制增加到 比您希望运行的模拟用户数量更高的数量。如何做到这一点取决于正在使用的操作系统。

注意:在Windows上运行蝗虫应该可以很好地开发和测试负载测试脚本。但是,在运行大规模测试时,建议您在Linux机器上这样做,因为gevent在Windows下的性能很差。

二、大家最关心的是如何使用locust去实战,这一节先说一下基础入门的,下面的代码是完成一个查询订单列表接口的性能测试,有俩种编写方式,先说第一种:

#从locust中导入HttpLocust类(代表用户),TaskSet(任务集类)

from locust importHttpLocust, TaskSet

# 查询商品列表的接口deftest1(s):

s.client.get('http://www.raincard.cn/api/v1/goods/list/admin/query')

# 查询订单列表的接口deftest2(s):

s.client.get('http://www.raincard.cn/api/v1/order/list/admin/query')class UserBehavior(TaskSet): #创建一个子类继承TaskSet任务集类(任务集类可以定义事件的各种属性)

tasks = {test2:2,test1:1} #定义test2和test1事件的随机比例,执行时会按照这个比例随机请求这俩个事件

"""创建一个子类继承HttpLocust类,HttpLocust类它代表一个用户,我们在其中定义一个模拟用户在执行任务之间应该等待多长时间,

以及什么TaskSet类应该定义用户的“行为”。任务集类可以嵌套。HttpLocust类继承自Locust类,并添加了一个客户端属性,

该属性是HttpSession的一个实例,可以用来发出HTTP请求。"""

classWebsiteUser(HttpLocust):

host= 'http://www.raincard.cn/management/' #在此处定义被测系统的地址

task_set =UserBehavior

min_wait= 5000 # 执行俩个任务之间的最小等待时间max_wait= 9000 # 执行俩个任务之间的最大等待时间

第二种方式:

"""我们可以声明任务的另一种方式(通常更方便)是使用@task"""

from locust importHttpLocust, TaskSet, taskclassUserBehavior(TaskSet):

@task(2) #这个装饰器代表test1这个任务执行的比例2,相对于test2来说是它的俩倍,也就是随机请求时概率更大,因为是模拟用户

#我们也不知道用户操作哪个任务更频繁,所以随机

deftest1(self):

self.client.get('http://www.raincard.cn/api/v1/goods/list/admin/query')

@task(1)deftest2(self):

self.client.get('http://www.raincard.cn/api/v1/order/list/admin/query')classWebsiteUser(HttpLocust):

host= 'http://www.raincard.cn/management/'task_set=UserBehavior

min_wait= 5000max_wait= 9000

二、模拟用户任务场景写好以后,接下来就是运行,我启动第二种方式文件:通过命令端启动

我在window下写的,cmd打开命令端:locust -f D:\Locust\locustfile.py --host=https://example.com       (host后面是自己定义的被测系统的地址,用于标识的,在UI界面上等会可以看到,作用不大,如果在代码中已经定义好了,此处host就就不用再定义了)

因为host我已经在代码中已经定义好了,所以换这个启动方式:locust -f D:\Locust\locustfile.py

三、看运行的ui界面,截图如下:

后面我会继续针对代码这部分深入讲解,今天只是入门,有兴趣的可以关注下,最近更新会比较频繁

python做性能测试_Python做性能测试-1、Locust基础篇相关推荐

  1. python正则表达式入门_Python正则表达式教程之一:基础篇

    前言 之前有人提了一个需求,我一看此需求用正则表达式最合适不过.考虑到之前每次使用正则表达式,都是临时抱佛脚,于是这次我就一边完成任务一边系统的学习了一遍正则表达式.主要参考PyCon2016上的一个 ...

  2. [Python从零到壹] 四十一.图像处理基础篇之图像采样处理

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  3. [Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  4. [Python从零到壹] 三十三.图像处理基础篇之什么是图像处理和OpenCV配置

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  5. [Python从零到壹] 四十.图像处理基础篇之图像量化处理

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  6. 自学python困难吗_Python学习难不难?零基础好学吗?

    Python学习难不难?零基础好学吗?我想对于很多人来说,这都是非常关键的问题,也是很多人都在疑惑的问题.现在市场发展,行业的竞争压力是非常大的,转型的人也是非常多,对于不少人转型人才来说,Pytho ...

  7. python之numpy基础_Python之NumPy学习(基础篇)

    NumPy(NumericalPython的缩写)是一个开源的Python科学计算库.使用NumPy,就可以很自然的使用数组和矩阵.NumPy包含很多实用的数学函数,涵盖线性代数运算.傅里叶变换和随机 ...

  8. python面试笔试宝典pdf_Python面试宝典之基础篇-06

    题目26:什么是鸭子类型(duck typing)? 鸭子类型是动态类型语言判断一个对象是不是某种类型时使用的方法,也叫做鸭子判定法.简单的说,鸭子类型是指判断一只鸟是不是鸭子,我们只关心它游泳像不像 ...

  9. python面试笔试宝典pdf_Python面试宝典之基础篇-02

    题目006:说说Python中的浅拷贝和深拷贝.点评:这个题目本身出现的频率非常高,但是就题论题而言没有什么技术含量.对于这种面试题,在回答的时候一定要让你的答案能够超出面试官的预期,这样才能获得更好 ...

  10. python面试笔试宝典pdf_Python面试宝典之基础篇-09

    题目41:说一下你对Python中模块和包的理解. 每个Python文件就是一个模块,而保存这些文件的文件夹就是一个包,但是这个作为Python包的文件夹必须要有一个名为__init__.py的文件, ...

最新文章

  1. R语言数据结构之矩阵
  2. 祝贺!又一批清华大学长聘教授,来了!
  3. Apriori算法简介及实现(python)
  4. Leetcode-169 Majority Element
  5. C++智能指针使用指南 part1:基本使用
  6. Python-杨辉三角
  7. SaltStack WEB UI Halite初体验
  8. [css] 请说说在什么时候用transition?什么时候使用animation?
  9. ViewDragHelper
  10. plsql数据库异常---plsql 登录后,提示数据库字符集(AL32UTF8)和客户端字符集(ZHS16GBK)不一致
  11. js时间搓化为今天明天_做猪皮冻,记住“泡一泡,刮一刮,搓一搓”,皮冻晶莹剔透无异味...
  12. 悄悄告诉你Java面试必备技能是什么?
  13. 【Datawhale IntelVINO学习笔记】OpenVINO音频和人体姿态识别
  14. 利用动态数组生成魔方矩阵
  15. word中批量修改上角标、下角标
  16. ES6新特性-前端面试问题
  17. wp兼容了android应用程序,WP兼容了Android应用 微软的春天就来了?
  18. 图片从前端回传到后端实现思路总结
  19. 通过canvas画出爱心图案,表达你的爱意!
  20. linux 搜狗拼音输入法

热门文章

  1. strpos、 strstr、 substr三个函数的对比讲解
  2. 莫比乌斯反演 BZOJ 2820
  3. ScrollView-图片的放大缩小
  4. mapabc全国兴趣点、商户数据、poi数据,一共1490多万条,包含地址、电话、经纬度、类别...
  5. 如何在win10 64位下搭载汇编环境(包含汇编dosbox和masm文件)
  6. 《测绘程序开发实习》导线网平差 C++上机实验报告 CSU
  7. GPCP全球月降水量数据下载与读取
  8. python函数参数为文件名_从零开始第5步:Python 函数和模块
  9. JDK动态代理与CGLIB的区别
  10. Hibernate检索方式简单总结