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

news2025/4/13 0:14:40

本人在做性能测试的过程中,遇到一个问题,测试机选了一台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.Concurrent

class 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.coloradmin.cn/o/1159325.html

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

相关文章

坚持#第420天~阿里云轻量服务器内存受AliYunDunMonito影响占用解决方法

阿里云轻量服务器内存受AliYunDunMonito影响占用解决方法&#xff0c;亲测有效&#xff1a; Mobax好卡啊&#xff0c;那就直接在阿里云后台操作即可&#xff0c;阿里云后台也可以上传文件。 Navicat mysql好卡啊&#xff0c;那就直接在阿里云后台最上面帮助的右边有个数据库&…

vscode插件安装

Error Lens错误提示 One Dark Pro代码颜色主题

区块链与教育:颠覆传统,引领未来

区块链与教育&#xff1a;颠覆传统&#xff0c;引领未来 摘要&#xff1a;本文将探讨区块链技术在教育领域的应用及其潜在影响。通过介绍区块链技术的基本原理、教育领域的现状&#xff0c;以及区块链技术在教育中的实际应用案例&#xff0c;我们将展望一个去中心化、安全可信…

NI-9219 100 S/s/ch国产化4通道C系列通用多功能模拟输入模块,支持多种传感器

100 S/s/ch&#xff0c;4通道C系列通用模拟输入模块 NI-9219专为多功能测试而设计。NI-9219可用于测量来自多种传感器&#xff08;如应变计&#xff0c;电阻温度检测器(RTD)&#xff0c;热电偶&#xff0c;测压元件和其他有源传感器等&#xff09;的信号&#xff0c;以及制作1…

如何确认目标期刊被SCI或EI收录?

原创内容&#xff0c;仅供参考&#xff0c;欢迎大家批评指正&#xff01; 目录 通过Web of Science查询SCI期刊1. 登录Web of Science2. 查找目标期刊3. 查看期刊信息 通过Scopus查询EI期刊1. 登录Scopus2. 查找目标期刊3. 查看期刊信息 参考 通过Web of Science查询SCI期刊 1…

518年会抽奖软件,支持超高的照片滚动速度

518抽奖软件简介 518抽奖软件&#xff0c;518我要发&#xff0c;超好用的年会抽奖软件&#xff0c;简约设计风格。 包含文字号码抽奖、照片抽奖两种模式&#xff0c;支持姓名抽奖、号码抽奖、数字抽奖、照片抽奖。(www.518cj.net) 照片缓存&#xff0c;支持高速滚动 1. 支持…

05 # 手写 bind

bind 干了什么&#xff1f; 改变 this 指向没有让函数执行&#xff0c;返回一个改变 this 指向后的函数 bind 难点在于参数的收集 手写 bind 简单实现如下&#xff1a; <script>Function.prototype.kaimoBind function (content) {// 获取到 bind 里的剩余参数let …

「软件设计师」 2023年上半年上午真题解析

「软件设计师」 2023年上半年上午真题解析 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备的 &…

echarts的图表立体感——实现立体柱状图和立体饼图的详细教程

&#x1f602;博主&#xff1a;小猫娃来啦 &#x1f602;文章核心&#xff1a;使用echarts实现立体柱状图和立体饼图的详细教程 文章目录 简单介绍立体柱状图和立体饼图环境配置实现立体柱状图实现立体饼图总结 简单介绍立体柱状图和立体饼图 立体柱状图和立体饼图是数据可视化…

MySQL Error 1215: Cannot add foreign key constraint

首先确保中介表中被设置外键的字段不能被设置为主键 第二步确保外键字段的属性与要连接的表的字段属性相同 第三步&#xff0c;设置表的选项 修改引擎为 InnoDB 三个表的引擎都要修改 最后就是运行代码 SET OLD_FOREIGN_KEY_CHECKSFOREIGN_KEY_CHECKS; SET FOREIGN_KEY_…

Python之循环语句

循环普遍存在于日常生活中&#xff0c;同样&#xff0c;在程序中&#xff0c;循环功能也是至关重要的基础功能。 循环在程序中同判断一样&#xff0c;也是广泛存在的&#xff0c;是非常多功能实现的基础 while循环的基础语法 生活中的循环 程序中的循环 只要条件满足 会无限循…

6-2 二叉树求结点数 分数 10

int NodeCountOfBiTree(BiTree T) {if (T nullptr)return 0;return 1 NodeCountOfBiTree(T->lchild) NodeCountOfBiTree(T->rchild); }

亚马逊卖家有必要自己养号?

亚马逊是非常注重用户体验的跨境电商平台&#xff0c;所以亚马逊的用户评论和点星对店铺权重的提升非常高&#xff0c;平台对评论的审核也极度严格 可以毫不夸张的说&#xff0c;在亚马逊平台上&#xff0c;用户的点星和评论是决定listing生死的关键因素 如果用户好评多&…

面试官:说一下你工作中发现的最有价值的bug

这个问题&#xff0c;基本95%的面试都会遇到。究竟面试官想要知道什么呢&#xff1f;让我们回到这个面试场景来看看。 “说一下你印象最深的bug" 你的脑子里拼命的回想过去遇到的印象深刻或有价值的bug。 “我就是做测试的&#xff0c;每天那么多bug&#xff0c;累计下…

10.31日模拟赛总结

文章目录 考试时间及策略考试结果考试反思题解A.进步科学B.吉吉没急C.老杰克哒D.季积晓淆 考试时间及策略 没啥好说的&#xff0c;因为好像都不会。所以全场感觉都在罚坐&#xff0c;很痛苦。 考试结果 30 0 50 5 85 考试反思 T1&#xff1a;T1是个神奇状压&#xff0…

友思特分享|不用3D点云,如何实现精准的物体识别与抓取?

摘要 面对技术变革的挑战&#xff0c;友思特 IDS相机以其卓越的图像识别和高速处理技术&#xff0c;为制造业提供了前沿的自动化解决方案。即使在复杂的光线条件下&#xff0c;友思特 IDS相机也始终保持稳定高效的表现。选择友思特&#xff0c;让您的生产力迈向更高峰&#xf…

Redis常见的全局命令

Redis中最核心的两个命令set和get 两个最核心的命令就是get和set. redis是按照键值对的方式来存储数据的,所以set就表示把key-value存储进去,get表示根据key来查询对应的value. 需要注意的是,必须进入redis客户端才能输入redis命令. 此处的key和value都是字符串类型.对于上述…

速谈 Beyond Compare 使用步骤

相信很多从事校对工作的工作者都听说过Beyond Compare软件。这是一款专业级的文件夹和文件对比工具&#xff0c;使用它可以很方便地对比出两个文件夹或文件的不同之处。很大程度上提高校对的准确率。但是一些初级使用者可能对Beyond Compare不是很了解&#xff0c;不知道该如何…

PostgreSQL 工具的相关介绍

1.1 psql工具 psql是PostgreSQL中的一个命令行交互式客户端工具&#xff0c;类似 Oracle中的命令行工具sqlplus&#xff0c;它允许用户交互地键入SQL语句或命 令&#xff0c;然后将其发送给PostgreSQL服务器&#xff0c;再显示SQL语句或命令的结 果。 1.2 psql的简单使用 使用…

Django之FBV和CBV

一、FBV与CBV 在我们日常学习Django中&#xff0c;都是用的FBV&#xff08;function base views&#xff09;方式&#xff0c;就是在视图中用函数处理各种请求。而CBV&#xff08;class base view&#xff09;则是通过类来处理请求。 Python是一个面向对象的编程语言&#xff0…