jujube109 2021-04-25 16:26 采纳率: 100%
浏览 265
已采纳

python locust模拟带token请求是否存在缺陷?

最近使用python locust对项目一个接口进行压测,由于被测接口使用的token进行用户凭证验证,大体实施思路是先请求登录接口获取响应头中的token,再将token拼接到被测接口的请求头中请求被测接口,实际运行时会有大概10%-20%的失败请求,初步验证是由于locuts模拟的token无效导致。

1.代码实现:

   login方法和被测接口实现方法都属于继承了TaskSet的类下

  1. 1获取token方法
 def login(self):
        pw = '*****'
        md = hashlib.md5()
        md.update(pw.encode('utf-8'))
        pwd5 = md.hexdigest()
        url = "http://******:*****/login/login"
        payload = json.dumps({
            "code": "****",
            "password": pwd5,
            "username": "****"
        })
        headers = {
            'Content-Type': 'application/json'
        }
        response = requests.request('post',url, headers=headers, data=payload)
        return response.headers['x-auth-token']
  1. 2.locust请求被测接口实现
        token = self.login()
        head={
            'x-auth-token': token,
            'Content-Type': 'application/json'
        }
        with self.client.post("/被测接口",headers= head,json=body,catch_response = True) as response:
            code=response.json().get("code")
            key=response.json().get("key")
            request_header=response.request.headers
            print("{0}--->:{1}".format(key,request_header),end="\n\n")
            if code != 200 and key!= "SUCCESS":
                response.failure("未成功请求响应码:%dkey值:%s"%(code,key))

由于被测接口对用户凭证验证成功或失败响应码都是200,所以通过if函数对响应体中的code值和key值进行判断,从而断言请求是否成功,响应中的code值不为200与key值不为SUCCESS直接将请求打为失败请求。print函数打印出响应体中的key值与请求头帮助验证。

2. 结果

  设置20个虚拟用户每秒启动5个(其实不管怎么设置),运行都会有将近20%的请求是失败请求

将控制台中print函数中的打印信息中响应key值为"NOT_LOGIN"的请求头中的token取出使用postman验证,code值依然为401,说明断言没问题

对比

  与jmeter比较正则提取出来的token,每次请求用的都是同一个token,但不会出现失败请求。

 

结论:

 初步验证认为locust会去模拟第一次拿到的token,但模拟的带token的请求通过后端验证率并不高,不知是locust内部对token处理机制的缺陷还是本人实现的错误。希望高人指教,谢谢!

  • 写回答

3条回答 默认 最新

  • CSDN专家-黄老师 2021-04-25 18:26
    关注

    不知道你是做爬虫还是做测试,模拟带token的请求先观察token每次请求是否都好变化,一般情况下,后端会对每个请求设置时间戳校验token,建议再分析每次请求的cookies,token的变化规律

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程