前言

有很多网站不登录的话,是无法访问到里面的页面的,这就需要先登录了
实现场景:先登录(只登录一次),然后访问页面->我的地盘页->产品页->项目页

官方案例

下面是一个简单的locustfile.py的简单示例:

from locust import HttpLocust, TaskSetdef login(l):l.client.post("/login", {"username":"ellen_key", "password":"education"})def logout(l):l.client.post("/logout", {"username":"ellen_key", "password":"education"})def index(l):l.client.get("/")def profile(l):l.client.get("/profile")class UserBehavior(TaskSet):tasks = {index: 2, profile: 1}def on_start(self):login(self)def on_stop(self):logout(self)class WebsiteUser(HttpLocust):task_set = UserBehaviormin_wait = 5000max_wait = 9000

这里我们定义了许多Locust任务,它们是带有一个参数(Locust类实例)的普通Python callables 。这些任务收集在tasks属性的TaskSet类下 。然后我们有一个代表用户的 类,我们在其中定义模拟用户在执行任务之间应该等待多长时间,以及哪个 类应该定义用户的“行为”。 类可以继承HttpLocust、TaskSet、TaskSet

HttpLocust类从继承 Locust的类,并把它添加一个客户端属性,它是的一个实例 HttpSession,可用于使HTTP请求。

另一种我们可以声明任务的方法,通常是更方便,就是使用 @task装饰器。以下代码与上述代码相同:

from locust import HttpLocust, TaskSet, taskclass UserBehavior(TaskSet):def on_start(self):""" on_start is called when a Locust start before any task is scheduled """self.login()def on_stop(self):""" on_stop is called when the TaskSet is stopping """self.logout()def login(self):self.client.post("/login", {"username":"ellen_key", "password":"education"})def logout(self):self.client.post("/logout", {"username":"ellen_key", "password":"education"})@task(2)def index(self):self.client.get("/")@task(1)def profile(self):self.client.get("/profile")class WebsiteUser(HttpLocust):task_set = UserBehaviormin_wait = 5000max_wait = 9000

在Locust类(以及HttpLocust 因为它是一个子类),也可以让一个在指定最小和最大等待时间毫秒,每个模拟用户之间的任务执行(min_wait和MAX_WAIT)以及其他用户的行为。默认情况下,时间是在min_wait和max_wait之间统一随机选择的,但是可以通过将wait_function设置为任意函数来使用任何用户定义的时间分布。例如,对于指数分布的等待时间平均为1秒:

import randomclass WebsiteUser(HttpLocust):task_set = UserBehaviourwait_function = lambda self: random.expovariate(1)*1000

项目实战:上面的官方案例只是一些伪代码,不能在真实的环境中跑起来,接下来把上面的理论执行用到真实的项目环境中http协议是无状态的,所以登录请求和登录后的请求它是独立的,但是登录后的请求需要依赖先登录拿到cookies,才能保持登录状态,可以用session来解决
s = requests.session()

HttpLocust类从继承 Locust的类,并把它添加一个客户端属性,它是的一个实例 HttpSession,可用于使HTTP请求,这就相当于它自动使用了session机制,类似于client = requests.session()所以后面的请求,直接拿client.get()、client.post()请求就可以了
# -*- coding: utf_8 -*-
# locust性能测试from locust import HttpLocust, TaskSet, task
import subprocess
import json# 性能测试任务类 TaskSet.
class UserBehavior(TaskSet):# 账户登陆def _loginname(self):url = "/global/do-login.action"body = {"loginName": "%s" % self.locust.loginName,"password": "%s" % self.locust.password,"pcCodeForFocusMedia": 0}h = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36","Content-Type": "application/x-www-form-urlencoded",}a = self.client.post(url=url, data=body, headers=h, verify=False)data = a.json()assert data['status'] == 202# 选择租户def _tenant(self):url = "/global/login-entry.action"body = {"tenantId": "%s" % self.locust.tenantId,"passport.id": self.locust.passport_id,"encryptionKey": "%s" % self.locust.encryptionKey,"loginName": "%s" % self.locust.loginName}h = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36","Content-Type": "application/x-www-form-urlencoded",}b = self.client.post(url=url, data=body, headers=h, verify=False)data = b.json()assert data['status'] == 0def on_start(self):'''任务开始准备工作:只登录一次'''self._loginname()   # 账户登陆self._tenant()   # 选择租户# 任务@task(10)def getTagVals(self):u"""request_url:请求路径request_params:请求头参数request_json:请求json参数"""request_url = "/json/crm_dimension/dim-tree.action" # (待测试的路径)body = {"belongId":35,"dimType":1}response = self.client.post(url=request_url, data=body, verify=False)if response.status_code != 200:print(u"返回异常")print(u"请求返回状态码:", response.status_code)elif response.status_code == 200:print(u"返回正常")# 性能测试配置
class MobileUserLocust(HttpLocust):u"""min_wait :用户执行任务之间等待时间的下界,单位:毫秒。max_wait :用户执行任务之间等待时间的上界,单位:毫秒。"""# weight = 3task_set = UserBehaviorhost = "自己公司的url"  # (待测试的ip或者域名)min_wait = 3000max_wait = 6000loginName = "账号"password = 密码tenantId = 公司租户Id # 租户IDencryptionKey = "keyId"  # 保持登陆的keypassport_id = 默认 if __name__ == "__main__":subprocess.Popen("locust -f locustlearn.py", shell=True)

如何运行:首先打开到文件路径下、然后直接运行脚本  python locustlearn.py设置1个虚拟用户,每秒启动1个服务,点start后运行结果

从结果可以看到登录的请求只访问了一次,定义on_start()相当于用例的准备操作,当然还有on_stop()用于数据清理操作

作者:含笑半步颠√

博客链接:https://www.cnblogs.com/lixy-88428977

声明:本文为博主学习感悟总结,水平有限,如果不当,欢迎指正。如果您认为还不错,欢迎转载。转载与引用请注明作者及出处。


转载于:https://www.cnblogs.com/lixy-88428977/p/9668687.html

Locust性能测试_先登录场景案例相关推荐

  1. 系统对接方案_易对接企业微信对接场景案例

    方案简介: 财务单据对接:在客户利用企业微信提供的审批流程引擎和表单工具实现电子报销流程的同时,帮助客户将产生的电子单据数据同步到财务系统,智能自动生成财务凭证.对接总账,包括报销单.收款单.付款单. ...

  2. 系统对接方案_易对接-企业微信对接场景案例

    方案简介: 财务单据对接:在客户利用企业微信提供的审批流程引擎和表单工具实现电子报销流程的同时,帮助客户将产生的电子单据数据同步到财务系统,智能自动生成财务凭证.对接总账,包括报销单.收款单.付款单. ...

  3. python locust 能压测数据库_python locust 性能测试:HOOKS钩子方法

    为locust中不同类型的事件,提供的钩子方法: from locust import TaskSet, task, events, Locust from locust.clients import ...

  4. 速递 | 在线教育行业 12 大核心场景案例全解析!

    以神策 5 年来服务多家在线教育类客户的经验而言,大多在线教育企业较为重视"用户""内容"两大主体,在这两大主体下关注用户来源.学习目的.产品交互.学习偏好.课 ...

  5. 数据可视化组队学习:《Task06 - 场景案例显神通》笔记

    文章目录 前言 1 展示趋势变化(Evolution) 1.1 折线图 1.1.1 简单线图 1.1.2 突出某一重点的多线图 1.2 面积图 1.3 堆积面积图 2 展示分布关系 2.1 小提琴图 ...

  6. redis位图法统计活跃用户+统计3天的连续登录用户案例

    Setbit 场景: 1亿个用户, 每个用户 登陆/做任意操作 ,记为今天活跃,否则记为不活跃 用法 周一:1001 0001 1001 0101 1011 0101 周二:1101 0001 101 ...

  7. 用户画像有什么用?怎样用?6个场景案例给你讲明白

    导读:企业的精细化运营.数据驱动都是基于大数据分析来进行的. 在大数据分析中,对用户行为进行分析挖掘又是一个重要的方向,通过对用户行为进行分析,企业可以了解用户从哪里来,进入平台后进行了哪些操作,什么 ...

  8. Day06_动态组件_插槽_自定义指令_tabbar案例

    Day06_动态组件_插槽_自定义指令_tabbar案例 文章目录 Day06_动态组件_插槽_自定义指令_tabbar案例 知识点自测 今日学习目标 1. 组件进阶 1.0 组件进阶 - 动态组件 ...

  9. JavaWeb-WEB核心7 会话技术 理解什么是会话跟踪技术掌握Cookie的使用掌握Session的使用(钝化、活化)完善用户登录注册案例的功能

    会话技术 今日目标 理解什么是会话跟踪技术 掌握Cookie的使用 掌握Session的使用 完善用户登录注册案例的功能 1,会话跟踪技术的概述 对于会话跟踪这四个词,我们需要拆开来进行解释,首先要理 ...

最新文章

  1. mysql输出非零列_如何只提取mysql和php中具有非零值的列?
  2. jQuery中的文档操作处理(五):append()、prepend()、after()、before()、wrap()、wrapAll()、wrapInner()、clone()等...
  3. 我想做一个课程表系统利用PHP+MYSQL+HTML实现课表的展示,但是不知道如何实现
  4. c语言电子计算器课程设计报告,计算机程序设计课程设计报告.doc
  5. 二分二题-P1678,P3902【二分,LIS】
  6. 转换时间格式24小时_昼夜节律|来认识下你身体24小时的时间表
  7. UInput使用注意事项
  8. CentOS搭建全功能服务器(Nginx+Tomcat+PHP+SSL)
  9. centos6.5 redis3 开机自动启动命令设置
  10. ubuntu 20.04 安装腾讯官方微信
  11. 如何抢功,甩锅,立于不败之地???
  12. OSPF虚链路与认证
  13. python求解立方根_求解立方根
  14. win7不能在本地计算机启动防火墙,Win7防火墙启动不了的原因及解决办法
  15. 平安银行薪资职级表_秋招提前批!平安银行总行公告发布!薪资拿到手软~
  16. 中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”, 问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题
  17. 深圳python培训班费用-深圳哪里有Python培训班?
  18. Word2Vec详解-公式推导以及代码
  19. Android 11 无线充电动画、铃声及问题分析
  20. 荣耀手机在HBuilderX中运行uni-app真机测试检测不到设备的解决方案

热门文章

  1. 疯丫头--之---“没心没肺”----的----华山之行
  2. 批量给pdf加水印,pdf批量加水印方法
  3. 大数据处理实践探索 ---- 数据清洗的目的、方法
  4. steamvr自定义按键_SteamVR脚本解析
  5. 有哪些你追了很多女生才明白的道理?
  6. 人类终极挑战:赋予人造细胞生命,全人工细胞实现临近
  7. 大二初学者用c++实现平抛运动
  8. 智能客服平台的架构设计,实现高效、安全、可靠的服务运行
  9. 【字符串处理】【RQNOJ】伯虎点秋香
  10. 手机通信专有名词中英文对照O-Z