性能测试请求重试实现思路

文章目录

  • 一、背景
  • 二、尝试的解决方案
  • 三、解决方案1:jmeter retrier插件!有点用但是不是特别有用-_-||
  • 四,最终解决方案:lucust!

一、背景

最近系统需要压测一些活动,场景是新建抽奖活动之后,每隔2s查询1次(最多3次,3次后还是失败就算失败),查询到中奖为止

二、尝试的解决方案

这个是抽奖接口的response
在这里插入图片描述
一开始我的实现思路是这样的
1、 创建while controller

2、添加查询状态的http sampler

3、添加定时器,每隔2s执行一次查询

4、添加beanshell 脚本,记录轮询的次数。
我的脚本结构如下:
在这里插入图片描述
在这里插入图片描述
但是我这样查询的结果,是按照查询总次数来的
在这里插入图片描述
开发是希望如果是10个线程,那总个数是10次,看来jmeter自身是没办法实现了。
只能用bean shell或者写个java脚本搞成jar包解决问题。

三、解决方案1:jmeter retrier插件!有点用但是不是特别有用-_-||

后面我就去百度,发现有人推荐这个插件

jmeter retrier

使用方法:下载了jar包以后把它放到ext文件夹下面,然后重启jmeter,右键-添加-后置处理器-retry post processor(具体的使用方法可以去github看看readme,我懒哈哈哈)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
但是这个使用过程中还是有问题,它的重试条件还是不灵活,比如上面的,我要同时满足比如响应状态码为200,还有返回的data.code=0,但是这边好像没办法这么配置(可能是我不会用),没办法很灵活的用

四,最终解决方案:lucust!

罢了,还是直接换个工具吧,用了lucust写脚本更灵活,也很简单,而且出来的报告又好看,谁不喜欢呢哈哈哈

import os
import randomfrom locust import HttpUser, between, task, SequentialTaskSetheaders = {'x-auth-token': 'GUIDE_4hFNGkOkQvuSPk86P2iEsypewK', 'Content-Type': 'application/json'}tokens = ["Bearer 7PhvW-0F_0XOyXwFq1P5IvkO2d3CpshBLSi_NRMaK3uWAFX9WRd51uyedKG_y3JC5uXT]
class activity_coupon(SequentialTaskSet):wait_time = between(2, 2)@task(1)def test_apply(self):self.flag = Falseself.token = random.sample(tokens, 1)[0]url = "/consumer/draw/participate/18a74f0020002?brand=10039"headers = {'Host': 'consumer-fat.myaiwecom.com','content-type': 'application/json;charset=UTF-8','Authorization': self.token,'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.34(0x18002231) NetType/WIFI Language/zh_CN','Referer': 'https://servicewechat.com/wxfe6b58432a64a957/39/page-frame.html'}with self.client.request(method='get', url=url, headers=headers,catch_response=True) as response:if response.status_code == 200:# print(444,response.text)self.trace_id = response.json()['data']['traceId']response.success()else:print(555, response.status_code, response.text)response.failure(str(response.status_code) + str(response.text))@task(1)def test_result1(self):url = "/consumer/draw/result/{}?activityId=18a74f0020002&brand=10039".format(self.trace_id)headers = {'Authorization': self.token}with self.client.request(method='get', url=url, headers=headers, name='result1',catch_response=True) as response:if response.status_code == 200:response.success()if response.json()['code'] == 0:print(111, response.json())self.flag = Trueelse:response.failure(str(response.status_code) + str(response.text))@task(1)def test_result2(self):if self.flag:returnurl = "/consumer/draw/result/{}?activityId=18a74f0020002&brand=10039".format(self.trace_id)headers = {'Authorization': self.token}with self.client.request(method='get', url=url, headers=headers, name='result2',catch_response=True) as response:if response.status_code == 200:response.success()if response.json()['code'] == 0:print(222, response.json())self.flag = Trueelse:response.failure(str(response.text))@task(1)def test_result3(self):if self.flag:returnurl = "/consumer/draw/result/{}?activityId=18a74f0020002&brand=10039".format(self.trace_id)headers = {'Authorization': random.sample(tokens, 1)[0]}with self.client.request(method='get', url=url, headers=headers, name='result3',catch_response=True) as response:if response.status_code == 200:if response.json()['code'] == 0 and response.json()['data']['winPrize'] == True:response.success()else:response.failure(str(response.text))else:response.failure(str(response.text))class MOCPerf(HttpUser):tasks = [activity_coupon]host = 'https://consumer-fat.m1.com'if __name__ == "__main__":os.system("locust -f %s " % __file__)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/8897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring6——入门

文章目录 入门环境要求构建模块程序开发引入依赖创建java类创建配置文件创建测试类运行测试程序 程序分析启用Log4j2日志框架Log4j2日志概述引入Log4j2依赖加入日志配置文件测试使用日志 入门 环境要求 JDK:Java17(Spring6要求JDK最低版本是Java17&…

Linux - find指令详细解释

来自chatgpt find 是一个强大的 Linux 命令行工具&#xff0c;用于在指定路径下查找文件和目录。它支持基于多种条件进行搜索&#xff0c;例如文件名、大小、类型、时间以及其他属性。 基本用法&#xff1a; find <path>&#xff1a;指定要搜索的起始路径&#xff08;默认…

【Shell】Shell编程之免交互

免交互&#xff1a;不需要人为控制就可以完成的自动化操作 自动化运维 Shell脚本和免交互是一个概念&#xff0c;但是两种写法 here document 使用i/o重定向的方式将命令的列表提供给交互式的程序或者命令 是一种标准输入&#xff0c;只能接受正确的指令或命令&#x…

1-Linux的目录结构

Linux的目录结构是规定好的&#xff0c;不可以随意进行更改&#xff01; Linux的文件系统是采用级层式的树状目录结构&#xff0c;最上层是根目录–/&#xff0c;然后再在根目录下创建其它的目录。 各个目录中主要负责的功能和作用如下&#xff1a;&#xff08;主体的结构一定…

引入第三方字体库 第三方字体库Google Fonts

googlefonts官方网站 googlefonts中国网站 本人是在微信小程序中引入 在static中建一个文件夹font-family 例如字体链接&#xff1a;https://fonts.font.im/css?familyKirangHaerang 将该链接的返回的资源的复制到css文件中 font-family.css /* [0] */ font-face {font-fam…

通过cups接口,以代码形式设置默认打印机

1. 完整代码 #include "cups.h" #include <errno.h> #include <iostream>#define HTTP_MAX_URI 1024/** validate_name() - Make sure the printer name only contains valid chars.*/static int /* O - 0 if name is no good, 1 …

使用JMeter进行接口测试教程

安装 使用JMeter的前提需要安装JDK&#xff0c;需要JDK1.7以上版本目前在用的是JMeter5.2版本&#xff0c;大家可自行下载解压使用 运行 进入解压路径如E: \apache-jmeter-5.2\bin&#xff0c;双击jmeter.bat启动运行 启动后默认为英文版本&#xff0c;可通过Options – Ch…

专项练习-04编程语言-03JAVA-04

1. 设Tree为已定义的类名&#xff0c;下列语句能正确创建 Tree 对象的是 。A Tree tnew Tree; B Tree tnew Tree(); C Tree tTree(); D Tree t[ ]new Tree[10]; 正确答案&#xff1a;B 官方解析&#xff1a;暂无官方题目解析&#xff0c;去讨论区看看吧&#xff01; 知识点&…

使用node内置test runner,和 Jest say 拜拜

参考 https://nodejs.org/dist/latest-v20.x/docs/api/test.html#test-runner 在之前&#xff0c;我们写单元测试&#xff0c;必须安装第三方依赖包&#xff0c;而从node 20.0.0 版本之后&#xff0c;可以告别繁琐的第三方依赖包啦&#xff0c;可直接使用node的内置test runner…

centos中修改防火墙端口开放配置

1、直接进入文件修改 vim /etc/sysconfig/iptables 2、添加需要开放的端口 &#xff08;1&#xff09;添加需要开放的单个端口 4001 -A INPUT -m state --state NEW -m tcp -p tcp --dport 4001 -j ACCEPT &#xff08;2&#xff09;添加需要开放的某个网段端口 4001:4020 …

需求管理中最易忽视的6大重点

需求管理是产品经理的重点工作&#xff0c;如果无法有效进行需求管理&#xff0c;往往会引起需求变更、项目延期以及成本增加等问题。那么如何对需求进行高效管理&#xff0c;我们在需求管理中&#xff0c;往往最容易忽视的重点都有哪些&#xff1f; 1、重视项目整体管理计划 首…

VMWare虚拟机常用操作命令

今日一语&#xff1a;做到所有的细节都不放过&#xff0c;则可以避免99%已知的风险&#xff0c;但大多数都因懒惰而甘愿承受风险&#xff0c;至此悔不当初 查看虚拟机在本机网络的IP ip addr 本地向虚拟机传送文件 scp 文件 rootpath 虚拟机路径 enter后输入密码即可传输&am…

运维——编写脚本,使用mysqldump实现分库分表备份。

编写脚本&#xff0c;使用mysqldump实现分库分表备份。 #!/bin/bash# MySQL连接参数 DB_HOST"localhost" DB_PORT"3306" DB_USER"your_username" DB_PASSWORD"your_password"# 备份保存路径 BACKUP_DIR"/path/to/backup"# …

8-js高级-7(理解js的事件循环)

一、前言 JS是单线程语言&#xff0c;但是又可以做到异步处理高并发请求&#xff0c;这时就用到了JavaScript的事件循环机制 理解事件循环&#xff0c;可以帮助我们准确分析和运用各种异步形式&#xff0c;减少代码的不确定性&#xff0c;在一些执行效率优化上也能有明确的思路…

Qt设置开机自启动无法读取配置文件

问题&#xff1a; Qt5.9.4再注册表中加入开机自启动后&#xff0c;每次开机可以启动&#xff0c;但是无法读取配置文件 解决方案 再main()方法中加入QDir::setCurrent(QCoreApplication::applicationDirPath());即可。 static void AutoRunWithSystem(bool bAutoRun) {// 获取…

账号列表的删除编辑提交

<template><div><plan title"账号列表"><!-- selection-change"handleSelectionChange"添加这个属性就是点击可以得到你想要的value值 --><el-tablestyle"width: 100%":data"list"selection-change"h…

视频基础知识

1.视频比特率 视频的比特率是指传输过程中单位时间传输的数据量。可以理解为视频的编码采样率。单位是kbps&#xff0c;即每秒千比特。视频比特率是决定视频清晰度的一个重要指标。比特率越高&#xff0c;视频越清晰&#xff0c;但数据量也会越大。比如一部100分钟的电影&#…

K8S初级入门系列之五-Pod的高级特性

一、前言 前一篇我们了解了Pod的基本概念和操作&#xff0c;本篇我们继续研究Pod的一些高级特性&#xff0c;包括Pod的生命周期&#xff0c;pod探针&#xff0c;pod的调度等。 二、生命周期 1、Pod的生命周期 Pod的生命周期示意图如下&#xff1a; 挂起(Pending)&#xff0c…

【C进阶】指针进阶(1)_二次复习版

目录 1. 字符指针 1.1常量字符串的修改 加上const解决问题 打印常量字符串 1.2数组存放的字符串 1.3例题:数组创建与常量池的区别 2. 指针数组 2.1字符指针数组 2.2整型指针数组 2.3使用3个一维数组,模拟实现一个二维数组 2.4例题: 3.数组指针 3.1 数组指针的定义…

Postman和JMeter:哪个更适合API测试

Postman 和 JMeter 都可以用来做 API 测试&#xff0c;但是它们之间有一些区别。 测试类型 Postman 主要用于功能测试和集成测试&#xff0c;而 JMeter 主要用于性能测试和负载测试&#xff0c;例如压力测试和并发测试。因此&#xff0c;如果你需要测试应用程序的性能和可伸缩…