目录

一、安装

二、常见使用方法

1、直接HttpUser中(常见,一般是代码量少)

2、写在模块中(少见)

3、单独写在taskset中(常见)

三、运行

四、TaskSet与SequentialTaskSet区别

场景一

场景二

五、代码执行顺顺序

六、参数化

场景一

场景二

场景三


一、安装

官方

https://docs.locust.io/en/stable/installation.html

pip3 install locust# 查看版本
locust -V

二、常见使用方法

1、直接HttpUser中(常见,一般是代码量少)

from locust import HttpUser, constant, between, task, TaskSet, SequentialTaskSet
class Login(HttpUser):host = 'http://1.72.24.40:23'# wait_time = constant(3)  # 每次请求停顿时间 (思考时间)wait_time = between(1, 3)@taskdef login(self):url = '/login'json = {            "password": "45","username": "34",}header = {"Content-Type": "application/json;charset=UTF-8"}self.client.request(method='POST', url=url, json=json, headers=header, name='登录1')

2、写在模块中(少见)

from locust import HttpUser, constant, between, task, TaskSet, SequentialTaskSet
@task
def login(param):url = '/login'json = {            "password": "45","username": "34",}header = {"Content-Type": "application/json;charset=UTF-8"}param.client.request(method='POST', url=url, json=json, headers=header, name='登录1')@task
def home(param):url = '/#/login'param.client.request(method='GET', url=url, name='首页')class Login(HttpUser):host = 'http://1.72.24.40:23'# wait_time = constant(3)  # 每次请求停顿时间 (思考时间)wait_time = between(1, 3)tasks = [login, home]

3、单独写在taskset中(常见)

from locust import HttpUser, constant, between, task, TaskSet, SequentialTaskSetclass TaskTest(TaskSet):@taskdef login(self):url = '/login'json = {"password": "rewr","username": "rewr",}header = {"Content-Type": "application/json;charset=UTF-8"}self.client.request(method='POST', url=url, json=json, headers=header, name='登录')class Login(HttpUser):host = 'http://s2.x.x.x:x'# wait_time = constant(3)  # 每次请求停顿时间 (思考时间)wait_time = between(1, 3)tasks = [TaskTest]

三、运行

locust -f 文件路径+文件名.py 

浏览器输入

http://localhost:8089/

四、TaskSet与SequentialTaskSet区别

继承TaskSet类,那么对应里面的方法是并行执行的,继承SequentialTaskSet类,那么对应里面的方法是串行执行的。

场景一

例如:登录一次,添加50次,那么可以考虑使用继承SequentialTaskSet类,然后在装饰器task当中进行设置

场景二

配合on_start、on_stop(这里例子没有使用到)使用askSet然后通过配置task。on_start、on_stop是每个用户开始和结束的时候都会执行一次。

模拟100个用户,先登录系统,然后90%执行A操作,10%执行B操作

# -*- coding: utf-8 -*-
# @Time    : 2021/6/14 8:17
# @Project : virlocustdemo
# @Author  : testing
# @File    : locus2ss.py
# @Software: PyCharm
from locust import HttpUser, constant, between, task, TaskSet, SequentialTaskSetclass TaskTest(TaskSet):"""这里继承的是串行执行的类"""token = None# 用户执行task前调用def on_start(self):url = '/XX/XX/login'json = {           "password": "888X23338","username": "XXXX"}header = {"Content-Type": "application/json}try:with self.client.post(url=url, json=json, headers=header, name='登录') as response:self.token = 'Bearer' + ' ' + res['data']['access_token']except Exception as e:print("错误信息为", e)# 用户执行task后调用def on_stop(self):print("用户结束")@task(90)def query_users(self):url = '/DSAD/userMDSADe/DS'json = {"pageIndex": "1","pageSize": "200"}header = {"Content-Type": "application/json,"Authorization": self.token}try:self.client.get(url=url, params=json, headers=header, name='A')except Exception as e:print("错误信息为", e)@task(10)def query_oErg_tEWee(self):url = '/uWEW/usEWEWe/orEWEree'json = {"enRdLeERvTel": "1"}header = {"Content-Type": "application/json,"Authorization": self.token}try:self.client.get(url=url, params=json, headers=header, name='B')except Exception as e:print("错误信息为", e)class Login(HttpUser):host = 'http://X2.122.123.20:138'# wait_time = constant(3)  # 每次请求停顿时间 (思考时间)wait_time = between(1, 3)tasks = [TaskTest]

五、代码执行顺顺序

测试项目执行前会执行一次SETUP,测试项目结束后会执行一次TEARDOWN。

import time
from locust import HttpUser,task,between,events
import urllib3
urllib3.disable_warnings()@events.test_start.add_listener
def on_test_start(**kwargs):print('===测试最开始提示===')@events.test_stop.add_listener
def on_test_stop(**kwargs):print('===测试结束了提示===')class TestTask(HttpUser):wait_time = between(1, 5)host = 'https://www.baidu.com'def on_start(self):print('这是SETUP,每次实例化User前都会执行!')@task(1)def getBaidu(self):self.client.get(url="/",verify=False)def on_stop(self):print('这是TEARDOWN,每次销毁User实例时都会执行!')if __name__ == "__main__":import osos.system("locust -f testpy.py --headless -u 10 -r 10 -t 2")

执行结果

testpy.py
[2020-11-02 14:29:17,562] admin/WARNING/locust.main: System open file limit setting is not high enough for load testing, and the OS didn't allow locust to increase it by itself. See https://github.com/locustio/locust/wiki/Installation#increasing-maximum-number-of-open-files-limit for more info.
===测试最开始提示===
[2020-11-02 14:29:17,563] admin/INFO/locust.main: Run time limit set to 2 seconds
[2020-11-02 14:29:17,563] admin/INFO/locust.main: Starting Locust 1.2.2
[2020-11-02 14:29:17,572] admin/INFO/locust.runners: Spawning 10 users at the rate 10 users/s (0 users already running)...Name # reqs # fails | Avg Min Max Median | req/s failures/s
--------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------- Aggregated 0     0(0.00%) | 0       0       0       0  | 0.00    0.00
这是SETUP,每次实例化User前都会执行!
这是SETUP,每次实例化User前都会执行!
这是SETUP,每次实例化User前都会执行!
这是SETUP,每次实例化User前都会执行!
这是SETUP,每次实例化User前都会执行!
这是SETUP,每次实例化User前都会执行!
这是SETUP,每次实例化User前都会执行!
这是SETUP,每次实例化User前都会执行!
这是SETUP,每次实例化User前都会执行!
[2020-11-02 14:29:18,477] admin/INFO/locust.runners: All users spawned: TestTask: 10 (0 already running)
这是SETUP,每次实例化User前都会执行!
[2020-11-02 14:29:19,189] admin/INFO/locust.main: Time limit reached. Stopping Locust.
[2020-11-02 14:29:19,189] admin/INFO/locust.runners: Stopping 10 users
这是TEARDOWN,每次销毁User实例时都会执行!
这是TEARDOWN,每次销毁User实例时都会执行!
这是TEARDOWN,每次销毁User实例时都会执行!
这是TEARDOWN,每次销毁User实例时都会执行!
这是TEARDOWN,每次销毁User实例时都会执行!
这是TEARDOWN,每次销毁User实例时都会执行!
这是TEARDOWN,每次销毁User实例时都会执行!
这是TEARDOWN,每次销毁User实例时都会执行!
这是TEARDOWN,每次销毁User实例时都会执行!
这是TEARDOWN,每次销毁User实例时都会执行!
[2020-11-02 14:29:19,201] admin/INFO/locust.runners: 10 Users have been stopped
===测试结束了提示===
[2020-11-02 14:29:19,202] admin/INFO/locust.main: Running teardowns...
[2020-11-02 14:29:19,211] admin/INFO/locust.main: Shutting down (exit code 0), bye.
[2020-11-02 14:29:19,211] admin/INFO/locust.main: Cleaning up runner...Name # reqs # fails | Avg Min Max Median | req/s failures/s
-------------------------------------------------------------------------------------------------------------------------------------------- GET / 10     0(0.00%) | 156     139     172     160  | 9.40    0.00
-------------------------------------------------------------------------------------------------------------------------------------------- Aggregated 10     0(0.00%) | 156     139     172     160  | 9.40    0.00
Response time percentiles (approximated)Type Name 50% 66% 75% 80% 90% 95% 98% 99% 99.9% 99.99% 100% # reqs
--------|------------------------------------------------------------|---------|------|------|------|------|------|------|------|------|------|------|------|GET / 160    160    160    170    170    170    170    170    170    170 170     10
--------|------------------------------------------------------------|---------|------|------|------|------|------|------|------|------|------|------|------|None Aggregated 160    160    160    170    170    170    170    170    170    170 170     10

六、参数化

场景一

模拟3个用户并发请求网页,共有100个URL地址,每个虚拟用户都会依次循环加载100个URL地址


# -*- coding: utf-8 -*-
"""
@ auth : carl_DJ  来自博主
@ time : 2020-9-23
"""from locust import TaskSet, task, HttpUserclass UserBehav(TaskSet):def on_start(self):self.index = 0@taskdef test_visit(self):url = self.user.share_data[self.index]# url = self.locust.share_data[self.index]print('visit url: %s' % url)self.index = (self.index + 1) % len(self.locust.share_data)self.client.get(url)class WebsiteUser( HttpUser):host = 'http://www.xxx.com'task_set = task(UserBehav)share_data = ['url1', 'url2', 'url3', 'url4', 'url5']min_wait = 1000max_wait = 15000

场景二

模拟3用户并发注册账号,共有9个账号,要求注册账号不重复,注册完毕后结束测试

概括:
保证并发测试数据唯一性,不循环取数据
>>>所有并发虚拟用户共享同一份测试数据,并且保证虚拟用户使用的数据不重复;

代码
采用队列


# -*- coding: utf-8 -*-
"""
@ auth : carl_DJ 来自博主 这里使用了队列
@ time : 2020-9-23
"""from locust import TaskSet, task, HttpUser
import queue
class UserBehav(TaskSet):@taskdef test_register(self):try:data = self.user.user_data_queue.get()# data = self.locust.user_data_queue.get()except queue.Empty:print('account data run out, test ended.')exit(0)print('register with user: {}, pwd: {}'\.format(data['username'], data['password']))payload = {'username': data['username'],'password': data['password']}self.client.post('/register', data=payload)class WebsiteUser(HttpUser):host = 'http://www.xxx.com'task_set = task(UserBehav) user_data_queue = queue.Queue()for index in range(100):data = {"username": "test%04d" % index,"password": "pwd%04d" % index,"email": "test%04d@debugtalk.test" % index,"phone": "186%08d" % index,}user_data_queue.put_nowait(data)min_wait = 1000max_wait = 15000

场景三

模拟3个用户并发登录账号,总共有9个账号,要求并发登录账号不相同,但数据可循环使用;

概括:
保证并发测试数据唯一性,循环取数据
>>>所有并发虚拟用户共享同一份测试数据,保证并发虚拟用户使用的数据不重复,并且数据可循环重复使用

# -*- coding: utf-8 -*-
"""
@ auth : carl_DJ 来自博主 收藏学习
@ time : 2020-9-23
"""from locust import TaskSet, task, HttpUser
import queue
class UserBehav(TaskSet):@taskdef test_register(self):try:data = self.user.user_data_queue.get()# data = self.locust.user_data_queue.get()except queue.Empty:print('account data run out, test ended')exit(0)print('register with user: {0}, pwd: {1}' .format(data['username'], data['password']))payload = {'username': data['username'],'password': data['password']}self.client.post('/register', data=payload)self.user.user_data_queue.put_nowait(data)# self.locust.user_data_queue.put_nowait(data)
class WebsiteUser(HttpUser):host = 'http://www.xxx.com'task_set = task(UserBehav)user_data_queue = queue.Queue()for index in range(100):data = {"username": "test%04d" % index,"password": "pwd%04d" % index,"email": "test%04d@debugtalk.test" % index,"phone": "186%08d" % index,}user_data_queue.put_nowait(data)min_wait = 1000max_wait = 15000

locust快速入门相关推荐

  1. 性能工具之 Locust 简单入门

    文章目录 前言 快速安装 主要命令 快速上手 总结 前言 Locust is an easy-to-use, distributed, user load testing tool. It is in ...

  2. 0基础如何入门软件测试?10分钟从测试9个阶段带你快速入门【建议细品】

    0基础如何快速入门软件测试,本文从测试九个阶段,附带9张各阶段测试路线图带你走进软件测试,废话不多说直接上干货! 一.软件测试视频第一阶段-前置基础知识 1.学习目标: 可掌握的核心能力: 1. 熟悉 ...

  3. Shiro第一个程序:官方快速入门程序Qucickstart详解教程

    目录 一.下载解压 二.第一个Shiro程序 1. 导入依赖 2. 配置shiro配置文件 3. Quickstart.java 4. 启动测试 三.shiro.ini分析 四.Quickstart. ...

  4. 计算机入门新人必学,异世修真人怎么玩?新手快速入门必备技巧

    异世修真人怎么快速入门?最近新出来的一款文字修仙游戏,很多萌新不知道怎么玩?进小编给大家带来了游戏新手快速入门技巧攻略,希望可以帮到大家. 新手快速入门攻略 1.开局出来往下找婆婆,交互给点钱,旁边有 ...

  5. Spring Boot 2 快速教程:WebFlux 快速入门(二)

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘 ...

  6. Apache Hive 快速入门 (CentOS 7.3 + Hadoop-2.8 + Hive-2.1.1)

    2019独角兽企业重金招聘Python工程师标准>>> 本文节选自<Netkiller Database 手札> 第 63 章 Apache Hive 目录 63.1. ...

  7. 《iOS9开发快速入门》——导读

    本节书摘来自异步社区<iOS9开发快速入门>一书中的目录,作者 刘丽霞 , 邱晓华,更多章节内容可以访问云栖社区"异步社区"公众号查看 目 录 前 言 第1章 iOS ...

  8. BIML 101 - ETL数据清洗 系列 - BIML 快速入门教程 - 序

    BIML 101 - BIML 快速入门教程 做大数据的项目,最花时间的就是数据清洗. 没有一个相对可靠的数据,数据分析就是无木之舟,无水之源. 如果你已经进了ETL这个坑,而且预算有限,并且有大量的 ...

  9. python scrapy菜鸟教程_scrapy学习笔记(一)快速入门

    安装Scrapy Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv.json等文件中. 首先我们安装Scrapy. pip install sc ...

最新文章

  1. 腾讯微博即将关停,十年了,你用过吗?
  2. setBackgroundResource和setImageResource的区别
  3. 读书笔记-《增长黑客》-搭建增长团队
  4. innodb和myisam的区别
  5. python3.6入门到高阶(全栈) day015 初识面向对象
  6. html页面中Location对象跳转页面用法
  7. 打造自己的数据访问层(一)
  8. babel 无法解析jsx (webpack react )
  9. ActionContext介绍(在Struts2中)
  10. html中无序列表做成链接,Beautifulsoup从无序列表中提取文本和链接divulli(斯堪的纳维亚字符)...
  11. Linux 字体库复制安装
  12. SPSS中文视频教程下载
  13. 超市管理系统(JavaWeb版)
  14. Spring框架学习(十)SSM框架整合
  15. 使用JavaScript实现一个俄罗斯方块
  16. Java打造RPC框架(四):支持zookeeper与负载均衡
  17. java 随机字母_如何用java随机生成一个字母
  18. 揭示未来方向:2018中国TMT行业“领秀榜”盛典直击
  19. Android 对一个View进行缩放处理(放大或缩小View)案例
  20. Android”挂逼”修炼之行—微信摇骰子和猜拳作弊器原理解析

热门文章

  1. sqlite3中,blob字段的读取和写入
  2. 双粗虚线中间一条实线_马路上实线两边有很粗的虚线(中间实线或虚线两边还有很粗的虚线是啥意思)...
  3. Cesium之地形(1)
  4. 怎么用U盘制作原版系统启动盘
  5. The specified module could not be found的解决办法
  6. PWM方波的理解浅谈
  7. CSS 关于box-sizing: border-box
  8. srs linux开机启动,SRS之安装与使用
  9. TRECVID2005 Overview
  10. WMS系统架构设计的演变与选择