Locust性能测试2-先登录场景案例

前言

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

官方案例

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

from locust import HttpLocust, TaskSet def 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 = UserBehavior    min_wait = 5000    max_wait = 9000

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

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

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

from locust import HttpLocust, TaskSet, task class 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 = UserBehavior    min_wait = 5000    max_wait = 9000

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

import random class WebsiteUser(HttpLocust):    task_set = UserBehaviour    wait_function = lambda self: random.expovariate(1)*1000

项目实例

上面的官方案例只是一些伪代码,不能在真实的环境中跑起来,接下来把上面的理论执行用到真实的项目环境中
http协议是无状态的,所以登录请求和登录后的请求它是独立的,但是登录后的请求需要依赖先登录拿到cookies,才能保持登录状态,这个在之前《python接口自动化》一书里面讲过,可以用session来解决

s = requests.session()

HttpLocust类从继承 Locust的类,并把它添加一个客户端属性,它是的一个实例 HttpSession,可用于使HTTP请求,这就相当于它自动使用了session机制,类似于client = requests.session()
所以后面的请求,直接拿client.get()、client.post()请求就可以了

# 保存为locustfile.py # coding=utf-8 from locust import HttpLocust, TaskSet, task ''' 实现场景:先登录(只登录一次),然后访问->我的地盘页->产品页->项目页 访问我的地盘页面权重为2,产品页和项目页权重各为1 ***作者:上海-悠悠 QQ群:588402570** ''' class UserBehavior(TaskSet):    '''蝗虫行为类'''    def _login(self):        '''登录方法'''        # host = 'http://192.168.x.xx:80'  # 禅道的服务器地        loginUrl ="/zentao/user-login.html/"        h = {            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",            "Content-Type": "application/x-www-form-urlencoded",            }        body = {"account": "yoyo",  # 你自己的账号                "password": "******",    # 你自己的密码                "keepLogin[]": "on",                "referer": "/zentao/my/"                }        r = self.client.post(loginUrl, data=body, headers=h)        print(r.text)        assert "parent.location='/zentao/index.html'" in r.text    def on_start(self):        '''任务开始准备工作:只登录一次'''        self._login()    # 任务1-我的地盘    @task(2)    def zentao_my(self):        print("---访问页面-我的地盘---")        r = self.client.get("/zentao/my/")        assert "我的地盘" in r.text    # 任务2-产品页    @task(1)    def zentao_product(self):        print("---访问页面-产品页---")        r = self.client.get("/zentao/product-browse.html/")        assert "需求列表" in r.text    # 任务3-项目    @task(1)    def zentao_prject(self):        print("---访问页面-项目---")        r = self.client.get("/zentao/project/")        assert "项目首页" in r.text class WebsiteUser(HttpLocust):    task_set = UserBehavior    min_wait = 1000    max_wait = 2000 if __name__ == "__main__":    import os    os.system("locust -f locustfile.py --host=http://192.168.x.xx:80")

设置1个虚拟用户,每秒启动1个服务,点start后运行结果

从结果可以看到登录的请求只访问了一次,然后是“我的地盘”页面的次数差不多是产品页、项目页请求次数的2倍(这个只是概率上讲是2倍,不完全等于2倍)
定义on_start()相当于用例的准备操作,当然还有on_stop()用于数据清理操作

(0)

相关推荐

  • Python进程与线程知识

    Python进程与线程知识,Python开发语言现在已经是被大家非常看中的编程语言了,本篇文章给读者们分享一下Python进程与线程知识小结,本篇文章具有一定的参考借鉴价值,感兴趣的小伙伴来了解一下吧 ...

  • Django中使用Celery执行异步和定时任务的注意事项

    WEB前端开发社区 昨天 1. Windows中使用Celery 4.0及以后版本 Celery 4.0+及以后版本不支持在windows系统上运行.如果你希望在windows系统上使用celery, ...

  • 简单明了的 Python 多线程来了

    线程和进程   计算机的核心是CPU,它承担了所有的计算任务,就像是一座工厂在时刻运行. 如果工厂的资源有限,一次只能供一个车间来使用,也就是说当一个车间开工时其它车间不能工作,也就是一个CPU一次只 ...

  • 基于最新版本的locust代码post和get脚本编写

    最近在做压力测试,jemeter使用起来不稳定,而消耗电脑内存太大,loadrunner是收费的,虽有破解,但不太道德!后来使用了开源的locust locust是基于协程的开源的压力自动化测试框架, ...

  • 智慧灯杆九大落地应用场景案例独家汇总!

    智慧灯杆是智慧城市中的一大神器,是集颜值与功能于一身的多功能灯杆.智慧灯杆所拥有的的功能为:5G通信基站.智能照明.安防监控.环境监测.广播电视系统.无线WIFI.手机充电口.紧急呼叫按钮等等. 同时 ...

  • Locust性能测试1-环境准备与基本使用

    前言 提到性能测试,大部分小伙伴想到的就是LR和jmeter这种工具,小编一直不太喜欢写这种工具类的东西,我的原则是能用代码解决的问题,尽量不去用工具. python里面也有一个性能测试框架Locus ...

  • Locust性能测试3-no-web模式和csv报告保存

    前言 前面是在web页面操作,需要手动的点start启动,结束的时候也需要手工去点stop,没法自定义运行时间,这就不太方便. locust提供了命令行运行的方法,不启动web页面也能运行,这就是no ...

  • locust性能测试4-参数关联

    前言 前面[Locust性能测试2-先登录场景案例]讲了登录的案例,这种是直接传账号和密码就能登录了,有些登录的网站会复杂一点, 需要先从页面上动态获取参数,作为登录接口的请求参数,如[学信网:htt ...

  • Locust性能测试5-参数化之批量注册

    前言 实现场景:所有并发虚拟用户共享同一份测试数据,并且保证虚拟用户使用的数据不重复. 例如,模拟10用户并发注册账号,总共有100个手机号,要求注册账号不重复,注册完毕后结束测试 准备数据 虚拟用户 ...

  • httprunner学习1-环境与登录接口案例

    前言 HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试. 使用环境: python 3.6 httprunner 1 ...

  • Locust性能测试7-分布式执行

    前言 使用Locust进行性能测试时,当一台单机不足以模拟所需的用户数量的时候,可以在多台机器上分布式的执行性能测试. locust分布式启动场景有2种,一种是单机设置master和slave模式,另 ...

  • httprunner 2.x学习1-环境与登录接口案例

    前言 由于之前写过一个 httprunner 系列是针对 1.5.8 版本写的教程, httprunner版本更新的还挺快的,最近已经到3.x版本了,看了下改动还是挺大的. 但是考虑到目前还是有很多公 ...

  • 上海市智慧养老应用场景案例征集结果公布,部分获奖企业将亮相老博会

    为贯彻落实<国务院办公厅关于推进养老服务发展的意见>.<上海市养老服务条例>等文件精神,深化养老服务数字化转型,促进新一代信息技术和智能产品在养老服务领域应用,上海市物联网行业 ...