目录
目前访问登录后的一些页面,需要首先登录吧,下面2种方式实现:
-
一种是使用账号+密码(加密)登录的方式
账号密码登录的方式在前面的文章中有写过:一个locust压力测试登录例子——账号+密码(加密)。不过这个是对登录进行压力测试。这里对登录后的页面进行压力测试的话,登录接口其实只需要访问一次就可以了。
把前面的例子稍微改动下:
实现场景:先登录(只登录一次),然后访问页面->任务-我参与的任务->通讯录
from locust import HttpLocust, TaskSet, task
from locust.clients import HttpSession
import json
import hashlib #python md5加密方法
# Web性能测试
class UserBehavior(TaskSet):
def _login(self):
#密码加密:
mima='91*****li'
Jpwd = hashlib.md5() #创建一个MD5对象
Jpwd.update(mima.encode('utf-8'))
Npwd = Jpwd.hexdigest()
# print (Npwd)
self.head = {'Content-Type':'application/json', #这个类型说明服务端接收json格式的字符串
'Connection': 'keep-alive',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
}
self.form_data = {'signin_name':158******18, #如果这里不是数字,就用加引号。例如'signin_name':'lily'
'password':Npwd} #注意这里不需要给Npwd加引号
response=self.client.post("/api/account/team/signin",headers = self.head,json= self.form_data)) #这里对data进行转换,主要看Content-Type类型
print("Response status code:", response.status_code)
# print(response.content)
def on_start(self):
'''任务开始准备工作:只登录一次.'''
self._login()
# 任务1-任务-我参与的任务
@task(1)
def mytask(self):
print("---访问页面-任务-我参与的任务---")
r = self.client.get("/api/tasks/5d7851951647bf27375e3236?t=1568883989140")
assert "首页底部公司介绍" in r.text
# 任务2-任务-通讯录
@task(3)
def contacts(self):
print("---访问页面-通讯录---")
r = self.client.get("/api/departments/tree?async=false&t=1568884732067")
print(r.text)
assert "产品部" in r.text
class User(HttpLocust):
task_set = UserBehavior
min_wait = 1000
max_wait = 3000 #任务执行间隔1-3s
# host="https://zhlh.xxxxxx.com" #执行命令:locust -f zhlh.py
# 用下面的方法,就要把上面的host注释掉 #执行命令:python zhlh.py
if __name__ == "__main__":
import os
os.system("locust -f zhlhuser.py --host=https://zhlh.xxxxxx.com")
2、运行。指定压力用户数和用户产生的速度。设置1个虚拟用户,每秒启动1个服务,点start后运行结果。
3、运行结果。
从结果可以看到登录的请求只访问了一次,然后是“通讯录”页面的次数差不多是“我参与的任务”页请求次数的3倍(这个只是概率上讲是3倍,不完全等于3倍)
定义on_start()相当于用例的准备操作,当然还有on_stop用于数据清理操作.
注意:如果是设置多个用户,每个用户登录还是一次,其他不限制。如下例子:最终执行结果,登录接口requests 最多为5.
一种是绕过登录的方式
不想再用自己的逻辑去判断用户是否登陆。
看看Authorization这种认证方式的使用:假设服务端有一个收藏的接口,该接口的调用必须要先判断用户是否已经登录,但是我们不能在每一次接口调用的时候都携带上用户登录信息,这样太麻烦了,最好能有一种方式能够自动携带上这些东西,那就是Authorization认证。
我们的系统就是这个,有的系统可能是cookie。这里我对Authorization进行说明,网上百度很多这个问研发就好了。
登录前:
登录后随便查看一个接口:
这里就不需要账号密码登录,取登录后的状态,不过需要在header中的“authorization”过期后,下次先手动登录后获取更新下。这种方式也可以测试请求登录后的其他接口是否正常。
说明:这里只需要编写需要访问的页面。其他和上面的例子原理一样。
例子:摘取片段login2.py
header = {
'accept-encoding': "gzip",
'authorization': "Bearer Kn5mFk9icFibM2-sjfVtykLtUA0kqKgXV_ARsKB091J3fob_tzFuqqWM6dbc-zNuga9fQQeObQPgWZKI0LDTx9uUGpv3JNhfc4RAPD5lSobu4eMlu7JLfKnwsGDto4m96wpMBYR0Dg6tAx-ANZHth7pdz1hUGml3Jw33RDFPy_Xk_b6jm92eU2AbavTcmMjLa2ga1oSWJswE8CAM4j9wIkFQLem50mi5R_JkWgl4rf7yutpo1PADGkEzI_DUr5Fl",
'connection': "Keep-Alive",
'user-agent': "okhttp/3.12.1",
}
class UserBehavior(TaskSet):
# 任务1-我的会员专区
@task(1)
def huiyuan_my(self):
print("---访问页面-会员专区---")
r = self.client.get("/api/CAccount/GetUserInfo",headers=header)
assert "李莉莉" in r.text #断言,列表中应该有的名字
print("Response status code:", r.status_code)
相关文章: