利用Locust完成测试登录
作者:reader1   类别:Java开发    日期:2019-04-16 16:33:03    阅读:353 次   消耗积分:0 分



1.捕获请求

性能测试是基于接口测试的,对于蜗牛进销存系统的登录功能来说,我们先要分析登录请求和响应的数据,用代码去模拟实现,并最终利用Locust的工具去施加负载。这里继续使用HttpWatch工具来捕获登录请求进行分析。

 

(1)打开蜗牛进销存系统和HttpWatch,点击“Record”按钮开始录制,在蜗牛进销存系统上输入正确的用户名和密码进行登录操作。


微信图片_20190416163113.jpg


(2)很容易想到,登录是一个向服务器提交数据的操作,所以选择相应的POST请求来进行分析。


图片2.png


(3)点击HttpWatch中的“Headers”选项,查看请求和响应的头部信息,这里我们最关注的无非是请求头部的第一行内容:请求的类型和请求的地址。


图片3.png


(4)既然是POST请求,那当然有请求正文,点击“POST Data”选项,可以看到请求正文的三个参数,恰好对应了界面登录时的用户名、密码、验证码三个字段,如图-xx。注意这里依然使用的预先设置好的万能验证码来绕过验证。


图片4.png


(5)点击“Content”选项,显示响应内容为“login-pass”,从字面意思就能理解,这是登录成功时服务器返回的正文,那么届时去统计登录是否成功时,就要借助于此。


图片5.png


经过上述分析,我们对编写脚本也应用有了基本的雏形。但性能测试知识告诉我们需要“尽可能的模拟真实场景”,那么在实现完整脚本前我们还需要做一些工作。

 

2.循环用户


前面我们一直使用admin进行登录操作,但实际的场景往往是多个用户使用不同的账户进行登录,那么这里我们需要使用到循环获取用户。顺便说一点,这里的循环用户类似于LoadRunnder中的参数化的功能,只是Locust本身并没有这个概念,所以笔者称其为“循环”获取数据。


from locust import TaskSet, task, HttpLocust

class UserBehavior(TaskSet):

    def on_start(self):

        self.index = 0

        self.loginData = ['lm', 'liuchan', 'dy', 'wangwu', 'admin']

    @task

    def testUser(self):

        print("---- index :" + str(self.index))

        print("---- data :" + self.loginData[self.index])

        self.index = (self.index + 1) % len(self.loginData)

class WebsiteUser(HttpLocust):

    task_set = UserBehavior

    min_wait = 1000

    max_wait = 3000


在UserBehavior类中定义了一个on_start方法,当Locust运行时,首先会调用它,然后再去执行其他被@task修饰的任务,我们可以利用它来初始化测试数据,有些类似于构造方法的作用。on_start方法内声明了self.index用于保存下标,而列表self.loginData则保存需要登录的所有用户。


这里仅仅为了测试效果,所有在testUser方法中并没有发送任何请求,而是输出了当前的下标和对应的用户名,在testUser方法的最后,我们将self.index的值加1,目的是使下标的值在每次执行任务时都有变化,对len(self.loginData)取余数则是为了让self.index的值不会越界,由于self.loginData的长度是5,所以self.index的值始终都在0到4的范围内循环。

打开控制台cmd,成功启动Locust。


locust -f TestLoop.py --host=http://localhost

[2018-06-01 23:36:33,573] FS6V6WNJF0VQTT3/INFO/locust.main: Starting web monitor

 at *:8089

[2018-06-01 23:36:33,583] FS6V6WNJF0VQTT3/INFO/locust.main: Starting Locust 0.8


打开浏览器,输入:http://localhost:8089,为了方便观察,这里我们设置模拟用户数和用户产生率都为1,则始终只会有一个用户执行任务,最后点击“Start swarming”开始运行。

图片6.png



返回到控制台,观察输出的信息,可以看到下标的值在不断的循环,每次执行任务都输出了不同的用户,达到了循环的目的。


[2018-06-01 23:42:39,135] FS6V6WNJF0VQTT3/INFO/stdout: ---- index :0

[2018-06-01 23:42:39,135] FS6V6WNJF0VQTT3/INFO/stdout:

[2018-06-01 23:42:39,135] FS6V6WNJF0VQTT3/INFO/stdout: ---- data :lm

[2018-06-01 23:42:39,136] FS6V6WNJF0VQTT3/INFO/stdout:

[2018-06-01 23:42:41,036] FS6V6WNJF0VQTT3/INFO/stdout: ---- index :1

[2018-06-01 23:42:41,036] FS6V6WNJF0VQTT3/INFO/stdout:

[2018-06-01 23:42:41,037] FS6V6WNJF0VQTT3/INFO/stdout: ---- data :liuchan

[2018-06-01 23:42:41,037] FS6V6WNJF0VQTT3/INFO/stdout:

[2018-06-01 23:42:42,877] FS6V6WNJF0VQTT3/INFO/stdout: ---- index :2

[2018-06-01 23:42:42,878] FS6V6WNJF0VQTT3/INFO/stdout:

[2018-06-01 23:42:42,880] FS6V6WNJF0VQTT3/INFO/stdout: ---- data :dy

[2018-06-01 23:42:42,882] FS6V6WNJF0VQTT3/INFO/stdout:

[2018-06-01 23:42:45,696] FS6V6WNJF0VQTT3/INFO/stdout: ---- index :3

[2018-06-01 23:42:45,697] FS6V6WNJF0VQTT3/INFO/stdout:

[2018-06-01 23:42:45,699] FS6V6WNJF0VQTT3/INFO/stdout: ---- data :wangwu

[2018-06-01 23:42:45,701] FS6V6WNJF0VQTT3/INFO/stdout:

[2018-06-01 23:42:47,911] FS6V6WNJF0VQTT3/INFO/stdout: ---- index :4

[2018-06-01 23:42:47,912] FS6V6WNJF0VQTT3/INFO/stdout:

[2018-06-01 23:42:47,913] FS6V6WNJF0VQTT3/INFO/stdout: ---- data :admin

[2018-06-01 23:42:47,915] FS6V6WNJF0VQTT3/INFO/stdout:

[2018-06-01 23:42:49,779] FS6V6WNJF0VQTT3/INFO/stdout: ---- index :0

[2018-06-01 23:42:49,780] FS6V6WNJF0VQTT3/INFO/stdout:

[2018-06-01 23:42:49,782] FS6V6WNJF0VQTT3/INFO/stdout: ---- data :lm

[2018-06-01 23:42:49,784] FS6V6WNJF0VQTT3/INFO/stdout:


3.检查点


为了理解检查点,下面我们先写段代码来做一个试验。代码很简单,doLogin的任务里构造了请求正文的参数,我们故意设置一个错误的密码123456,接着对登录的地址发送POST请求,并添加正文body。


版权所有,转载本站文章请注明出处:蜗牛笔记, http://www.woniunote.com/article/91
上一篇:利用Locust测试销售出库
下一篇:利用Locust完成测试登录
${comment['nickname']}   ${comment['createtime']}
  
       
${comment.content}
${reply.nickname} 回复 ${comment.nickname}    ${reply.createtime}
     
  
回复内容:${reply.content}