1.捕获请求
性能测试是基于接口测试的,对于蜗牛进销存系统的登录功能来说,我们先要分析登录请求和响应的数据,用代码去模拟实现,并最终利用Locust的工具去施加负载。这里继续使用HttpWatch工具来捕获登录请求进行分析。
(1)打开蜗牛进销存系统和HttpWatch,点击“Record”按钮开始录制,在蜗牛进销存系统上输入正确的用户名和密码进行登录操作。

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

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

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

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

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

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