如何在Linux命令行界面愉快进行性能测试?

本人在做性能测试的过程中,遇到一个问题,测试机选了一台Linux服务器,只有命令行界面。执行测试用例不是非常的灵活,有时候我需要改一两个参数添加一些日志,都需要重新打包部署,虽然自动化构建比较方便,但感觉绕了一大圈,在经过一些简单尝试之后做好了两个方案

一个是针对单接口的压测,以配置文件形式完成每一个request的组装,然后通过调节并发的参数执行不同的测试用例,且支持多个请求一起压测;另外一个以groovy脚本形式执行用例,则需要在服务器上配置好groovy环境以及把项目打包后的jar包推送到groovy的lib目录下。

方案一:

package com.fun.utils.request;import com.fun.frame.SourceCode;
import com.fun.httpclient.FanLibrary;
import com.fun.profile.Constant;
import com.fun.utils.WriteRead;
import net.sf.json.JSONObject;
import org.apache.http.client.methods.HttpRequestBase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/*** 从文件中读取接口相关参数,用来发送请求,实现接口请求的配置化* <p>从当前路径下获取后缀为.log的文件,以文件名为准读取文件内容</p>*/
public class RequestFile extends SourceCode {private static Logger logger = LoggerFactory.getLogger(RequestFile.class);String url;/*** get对应get请求,post对应post请求表单参数,其他对应post请求json参数*/JSONObject headers;String requestType;String name;JSONObject info;JSONObject params;/*** @param name*/public RequestFile(String name) {this.name = name;getInfo();this.url = this.info.getString("url");requestType = this.info.getString("requestType");getParams();headers = JSONObject.fromObject(this.info.getString("headers"));}/*** 获取当前目录下的配置文件,以数字开头,后缀是.log的** @param i*/public RequestFile(int i) {this(i + Constant.EMPTY);}/*** 从配置文件中读取信息,组成一个json对象*/private void getInfo() {String filePath = Constant.WORK_SPACE + name;logger.info("配置文件地址:" + filePath);this.info = WriteRead.readTxtByJson(filePath);}/*** 获取请求参数*/private void getParams() {params = JSONObject.fromObject(info.getString("params"));}/*** 根据info组成请求** @return*/public HttpRequestBase getRequest() {HttpRequestBase requestBase = requestType.equalsIgnoreCase(Constant.REQUEST_TYPE_POST) ? FanLibrary.getHttpPost(this.url, this.params) : requestType.equalsIgnoreCase(Constant.REQUEST_TYPE_GET) ? FanLibrary.getHttpGet(this.url, this.params) : FanLibrary.getHttpPost(this.url, this.params.toString());FanLibrary.addHeaders(requestBase, headers);FanLibrary.setHeaderKey();output(FanLibrary.getHttpResponse(requestBase));return requestBase;}}
然后是通过main方法实现参数化:class PerformanceFromFile extends SourceCode {public static void main(String[] args) {MySqlTest.setFlag();def size = args.size();List<HttpRequestBase> list = new ArrayList<>()for (int i = 0; i < size - 1; i += 2) {def name = args[i]int thread = changeStringToInt(args[i + 1])def request = new RequestFile(name).getRequest()for (int j = 0; j < thread; j++) {list.add(request)}}int perTimes = changeStringToInt(args[size - 1])def concurrent = new Concurrent(list, perTimes)concurrent.start()FanLibrary.testOver()}
}

这里就不放Concurrent类的方法了,有兴趣的同学可以去翻一翻之前的文章。

执行用例的命令行:

java -jar performance.jar test 10 login 10 1000

解释一下,test脚本的请求分配10个线程,login脚本请求分配10个线程,每个线程执行1000次请求。下面是test的内容:

url=http://127.0.0.1:8050/api/pad/user/login
requestType=peost
params={"uname":"81951375115","pwd":"QJ81KU2LV6z1X4nA+czzvqVZVDsQnjOIKt857kEbemcs/SJW8GXL+sjOcemH5GFIm6rKKpqIOrqp1z0DUig/9QJouhBp1OQnZbNlkXSS84+IOQS022kbsN9e51r+GeyZDCrr7WWLenZJcyIE1BRrMeq1EkWCBotzwegXUJjR6Qs="}
headers={requestId:88888888}

方案一:

这个就比较简单了,首先在服务器上配置好groovy环境,然后把接口功能测试和自动化测试项目的打包jar放到groovy的lib目录下即可。这里用到了Jenkins自动化构建,在后置脚本中增加一行mv或者cp文件的shell即可。

然后在服务器上新建一个目录存放groovy脚本,下面放一个test脚本内容:

import com.fun.httpclient.FanLibrary
import com.okayqa.studentapd.base.OkayBase
import com.fun.frame.excute.Concurrentclass T8 extends OkayBase{public static void main(String[] args) {def base = getBase()output(base.getLoginResponse())def get = FanLibrary.requests.get(FanLibrary.requests.size() - 1)//  new Concurrent(get,10,100).start()FanLibrary.testOver()}
}

然后在服务器上通过vim就可以灵活编辑脚本,执行不同的用例了,包括打点日志什么都是没有问题的。

执行方法:

groovy test

当然也可以把参数放到调用的时候传入。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

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

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

相关文章

vscode debug skills

1) VSCode 调试 C/C 代码时&#xff0c;如何显示动态分配的指针数组。 创建一个动态分配的一维数组: int n 10; int *array (int *)malloc(n*sizeof(int)); memset(array, 1, n*sizeof(int)); 如果直接 Debug 时查看 array 指针&#xff0c;并不能看到数组所有的值。 查看…

从用户角度出发,如何优化大数据可视化体验|北京蓝蓝UI设计公司

作者&#xff1a;蓝蓝设计-鹤鹤 大数据已经成为人们探索世界的新工具。但是&#xff0c;对于普通用户而言&#xff0c;大数据往往比较抽象和难以理解&#xff0c;因此&#xff0c;大数据可视化作为一种非常有效的工具工具被广泛应用。然而&#xff0c;在实际应用中&#xff0c…

【Java笔试强训】Day8(WY20 两种排序方法、HJ108 求最小公倍数)

WY20 两种排序方法 链接&#xff1a;两种排序方法 题目&#xff1a; 考拉有n个字符串字符串&#xff0c;任意两个字符串长度都是不同的。考拉最近学习到有两种字符串的排序方法&#xff1a; 1.根据字符串的字典序排序。例如&#xff1a; “car” < “carriage” < “c…

pycharm安装教程-pycharm安装详细步骤(Mac版)

之前跟大家讲了怎么安装Python&#xff0c;这期跟大家介绍个很好用的编程工具–pycharm。 PyCharm是一种Python IDE&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单…

Azure 机器学习 - 使用无代码 AutoML 训练分类模型

了解如何在 Azure 机器学习工作室中使用 Azure 机器学习自动化 ML&#xff0c;通过无代码 AutoML 来训练分类模型。 此分类模型预测某个金融机构的客户是否会认购定期存款产品。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管…

Redis入门01-简单了解

目录 Redis的发展历史 特性简介 数据类型 内存存储与持久化 功能丰富 简单稳定 应用场景 为啥用Redis Redis的发展历史 Redis&#xff08;Remote Dictionary Server&#xff09;是一个高性能的键值存储系统&#xff0c;通常用作缓存、消息队列和分布式数据存储的解决方…

【算法专题】双指针—盛最多水的容器

一、题目解析 分析这个题目不难得出一个容积公式 二、算法原理 解法一&#xff1a;暴力枚举&#xff08;超时&#xff09; 套用上述的容积公式&#xff0c;使用两个for循环来枚举出所有可能的情况&#xff0c;再挑出最大值即可&#xff0c;但是这种写法会超时&#xff0c;导致…

06 # 手写 map 方法

map 的使用 map 自带循环功能&#xff0c;对数据中的元素进行加工&#xff0c;得到一个加工后的新数据 ele&#xff1a;表示数组中的每一个元素index&#xff1a;表示数据中元素的索引array&#xff1a;表示数组 <script>var arr [1, 3, 5, 7, 9];var result arr.ma…

X64指令基本格式

X64指令基本格式 1 REX Prefix结构2 REX prefix扩展位2.1 第一种&#xff0c;无SIB字节的内存寻址&#xff08;mod !11 &#xff09;2.2 第二种&#xff0c;寄存器到寄存器的寻址&#xff08;无内存操作数&#xff0c;mod11&#xff09;2.3 第三种&#xff0c;带SIB字节的内存寻…

栅栏密码fence cypher

f{_wi3_hlyk_lnceaonr_cirgu04fep} flag{you_kn0w_r4il_f3nce_cipher}

线段树 区间赋值 + 区间加减 + 求区间最值

线段树好题&#xff1a;P1253 扶苏的问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 区间赋值 区间加减 求区间最大。 对于区间赋值和区间加减来说&#xff0c;需要两个懒标记&#xff0c;一个表示赋值cover&#xff0c;一个表示加减add。 区间赋值的优先级大于区间加…

【AI视野·今日Sound 声学论文速览 第三十二期】Tue, 24 Oct 2023

AI视野今日CS.Sound 声学论文速览 Tue, 24 Oct 2023 Totally 20 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;nvas3d, 基于任意录音和室内3D信息合成重建不同听角&#xff08;位置&#xff09;处的新的声音。(from apple cmu) website: htt…

在职一年多,一个29岁软件测试工程师的心声

简单的先说一下&#xff0c;坐标西安&#xff0c;16届本科毕业&#xff0c;目前在跳槽&#xff0c;算上国庆节前的面试&#xff0c;一共有面试了5家公司&#xff08;因为不想请假&#xff0c;因此只是每个晚上去其他公司面试&#xff0c;所以面试的公司比较少&#xff09;其中成…

【394.字符串解码】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:string decodeString(string s) {stack<string> s1;s1.push("");stack<int> s2;int i 0, n s.size();while (i < n){//1.如果是数字入…

css:transform实现平移、旋转、缩放、倾斜元素

目录 文档语法示例旋转元素 transform-rotate旋转过渡旋转动画 参考文章 文档 https://developer.mozilla.org/zh-CN/docs/Web/CSS/transform 语法 /* Keyword values */ transform: none;/* Function values */ transform: matrix(1, 2, 3, 4, 5, 6); transform: translate…

京东数据分析:2023年9月京东洗地机行业品牌销售排行榜

鲸参谋监测的京东平台9月份洗地机市场销售数据已出炉&#xff01; 9月份&#xff0c;洗地机市场的销售额增长。根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;9月京东平台上洗地机的销量为9.2万&#xff0c;销售额将近2.2亿&#xff0c;同比增长约9%。从价格上看&#…

Android NDK开发详解之Android.mk探秘

Android NDK开发详解之Android.mk探秘 概览基础知识变量和宏NDK 定义的 include 变量CLEAR_VARSBUILD_EXECUTABLEBUILD_SHARED_LIBRARYBUILD_STATIC_LIBRARYPREBUILT_SHARED_LIBRARYPREBUILT_STATIC_LIBRARY 目标信息变量TARGET_ARCHTARGET_PLATFORMTARGET_ABI 模块描述变量LOC…

【组件】身份证卡片

效果展示 组件代码 <div class"cardOneRoot"><img :src"itemInfo.psnPicUrl ? itemInfo.psnPicUrl : " alt""/><div class"infoDiv" v-if"itemInfo.noInfo 1"><div v-for"(item2, index2) in …

信号、进程、线程、I/O介绍

文章目录 信号进程进程通信线程可/不可重入函数线程同步互斥锁条件变量自旋锁读写锁 I/O操作阻塞/非阻塞I/OI/O多路复用存储映射I/O 信号 信号是事件发生时对进程的通知机制&#xff0c;可以看做软件中断。信号与硬件中断的相似之处在于其能够打断程序当前执行的正常流程。大多…

保护生产中 Node.js 应用程序安全的 15 项最佳实践

在后端开发方面&#xff0c;Node.js 是开发人员最喜欢的技术之一。它的受欢迎程度不断上升&#xff0c;现已成为在线攻击的主要目标之一。这就是为什么保护 Node.js 免受漏洞和威胁至关重要。 在本指南中&#xff0c;您将看到为生产设计安全 Node.js 应用程序架构的 15 种最佳…