性能工具之ngrinder关联脚本编写(代码片段)

zuozewei zuozewei     2022-12-06     717

关键词:

一、前言

在做性能测试,脚本的关联是一个比较棘手的问题,nGrinder 脚本是怎么关联,其实也是比较简单的,简单前提条件是自己具备一定的代码基础、http 协议、网络等基础知识,这样才能顺利开展工作。

二、什么是关联?

  • 关联的目的是后面请求需要,如果不需要就不需要关联。
  • 关联获取结果做断言
  • 想了解更多、更详细关联知识请查找相关资料。

常见的获取请求结果方法有:

  • 通过正则表达方式获取结果
  • 通过 xpath 方式获取相关结果
  • 通过 json 解析获取相关结果

在编写 nGrinder 脚本之前请学习下 groovy 语法这样方便写脚本,脚本编写建议在 idea 中上写脚本与调试脚本,这样有语法提示能很快写出脚本与调试脚本,写完脚本后直接复制到线上脚本中在微调验证就能使用。

三、如何编写脚本?

这里脚本编写与调试需要解析 JSON 所以需要引入 fastjson 包

仓库地址为:https://mvnrepository.com/artifact/com.alibaba/fastjson

1、线上直接写脚本

需要上传 jar 包,在脚本页面的脚本文件夹中新建 lib 文件夹,之后再 lib 文件中上传相关的jar包,如下图:
在这里插入图片描述
点击文件夹:
在这里插入图片描述

在这里插入图片描述
注意:

一定在脚本文件相关的地方新建 lib 文件夹,并且在 lib 下中上传 jar 包

线上调试:
在这里插入图片描述

2、IDE 中写脚本

如果是 idea 中写代码与调试脚本,需要在脚本文件中新建 lib 文件夹之后在把 jar 包加入工程。
在这里插入图片描述
该工程下载后需要处理下才可以使用:
在这里插入图片描述

再次选择:
在这里插入图片描述
在这里插入图片描述
idea 中调试并且测试:

在这里插入图片描述

四、示例脚本

import HTTPClient.Cookie
import HTTPClient.CookieModule
import HTTPClient.HTTPResponse
import HTTPClient.NVPair
import com.alibaba.fastjson.JSON
import com.alibaba.fastjson.JSONArray
import groovy.json.JsonParser
import groovy.json.JsonSlurper
import net.grinder.plugin.http.HTTPPluginControl
import net.grinder.plugin.http.HTTPRequest
import net.grinder.script.GTest
import net.grinder.scriptengine.groovy.junit.GrinderRunner
import net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess
import net.grinder.scriptengine.groovy.junit.annotation.BeforeThread
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSON;

import static com.alibaba.fastjson.JSON.parse
import static net.grinder.script.Grinder.grinder
import static org.hamcrest.Matchers.is


// import static net.grinder.util.GrinderUtils.* // You can use this if you're using nGrinder after 3.2.3

import static org.junit.Assert.assertThat

/**
 * @Title: OneAndTwo
 * @author 7d
 * @date 2019/10/27 / 11:00
 */
@RunWith(GrinderRunner)
class OneAndTwo 

    public static GTest test
    // 定义 HTTPRequest 静态变量 request,用于发送 HTTP 请求
    public static HTTPRequest request
    // 定义 NVPair 数组 headers ,用于存放通用的请求头数据
    public static NVPair[] headers = []
    // 定义 NVPair 数组 params ,用于存放请求参数数据
    public static NVPair[] params = []
    // 定义 Cookie 数组 cookies ,用于存放通用的 cookie 数据
    public static Cookie[] cookies = []

    //存储第一个请求得参数
    def paramName = new ArrayList()


    @BeforeProcess
    public static void beforeProcess() 
        // 设置请求响应超时时间(ms)
        HTTPPluginControl.getConnectionDefaults().timeout = 6000
        // 创建GTest对象,第一个参数1代表有多个请求/事务时的执行顺序ID,
        // 第二个参数是请求/事务的名称,会显示在summary结果中,有多个请求/事务时,要创建多个GTest对象
        test = new GTest(1, "User_find_01")
        //创建 HTTPRequest 对象,用于发起 HTTP 请求
        request = new HTTPRequest()
        // Set header datas
        List<NVPair> headerList = new ArrayList<NVPair>()
        headerList.add(new NVPair("Content-Type", "application/x-www-form-urlencoded"))
        headerList.add(new NVPair("Connection", "keep-alive"))
        headers = headerList.toArray()
        // Set param datas

//        List<Cookie> cookieList = new ArrayList<Cookie>()
//        cookieList.add(new Cookie("Cookie", "null", "localhost:8888", "", new Date(), true))
//        cookies = cookieList.toArray()
        grinder.logger.info("before process.");

    

    @BeforeThread
    public void beforeThread() 
//        注册事件,启动test,第二个参数要与@Test注解的方法名保持一致,有多个请求/事务时,要注册多个事件
        test.record(this, "test")

        //配置延迟报告统计结果
        grinder.statistics.delayReports = true;
        grinder.logger.info("before thread.");
    

    @Before
    public void before() 
        //在这里可以添加headers属性和cookies
//        request.setHeaders(headers)
        cookies.each  CookieModule.addCookie(it, HTTPPluginControl.getThreadHTTPClientContext()) 
        grinder.logger.info("before thread. init headers and cookies");

    

    @Test
    public void test() 
        getUserFind()
        getItem()
    


    public void getUserFind() 
        // 发送GET请求
        HTTPResponse resu = request.GET("http://localhost:8888/userfind")
        def text1 = resu.getText()
        JSONObject jsonObject = JSONObject.parseObject(text1);
        JSONObject object = jsonObject.getJSONObject("extend")
        JSONArray array = object.getJSONArray("info")
        for (int i = 0; i < array.size(); i++) 
            JSONObject object1 = JSONObject.parseObject(array.get(i).toString())
            Object name = object1.get("userName");
            grinder.logger.info("这是获取得名字--->" + name)
            paramName.add(String.valueOf(name))
        
        grinder.logger.info("这是第一个请求:" + text1)
        assertThat(resu.statusCode, is(200))
    

    public void getItem() 
        List<NVPair> paramList = new ArrayList<NVPair>()
        //获取参数的第一个值
        paramList.add(new NVPair("userName", paramName.get(0)))
        params = paramList.toArray()
        // Set cookie datas
        HTTPResponse result = request.GET("http://localhost:8888/findName", params)
        def text = result.getText()

        grinder.logger.info("这是第二请求" + text)
        // 断言HTTP请求状态码
        assertThat(result.statusCode, is(200))
    


测试结果显示:
在这里插入图片描述
在这里插入图片描述
源码地址:

  • https://github.com/zuozewei/blog-example/blob/master/Performance-testing/01-test-tool/nGrinder/nGrinder-demo/script-sample/test-with-login/OneAndTwo.groovy

相关系列:

性能工具之jmeter关联入门(代码片段)

...代码路由参考代码Jmeter脚本编写结果总结背景关联是每个性能测试人员必须掌握的技能,是解决性能脚本中的"金钥匙"。主要原理简单的说:每次请求服务器,服务器会给客户端发送一个动态值,但服务器会... 查看详情

性能工具之ngrinder区域配置(代码片段)

文章目录一、前言二、部署架构图三、问题分析四、区域配置1、重命名war包并启动control服务2、修改数据库模式3、重新启动control4、数据迁移部分(如果不需要数据迁移可跳过此部分)五、验证测试六、其他Agent配置:一、前言... 查看详情

性能工具之jmeter上传与下载脚本编写(代码片段)

...编写1、文件上传脚本2、文件下载脚本五、总结一、前言性能测试工作中,文件上传也是经常见的性能压测场景之一,那么JMeter文件上传下载脚本怎么做?知识点: 查看详情

性能工具之jmeter关联入门(代码片段)

...代码路由参考代码Jmeter脚本编写结果总结背景关联是每个性能测试人员必须掌握的技能,是解决性能脚本中的"金钥匙"。主要原理简单的说:每次请求服务器,服务器会给客户端发送一个动态值,但服务器会... 查看详情

loadrunner性能测试系统学习教程:脚本编写之关联函数介绍

上期讲到LoadRunner性能测试脚本编写之关联技术,这期我们一起来学习脚本编写之关联函数介绍。PART1关联函数介绍LoadRunner最新版本中使用的关联函数为web_reg_save_param_ex以前的版本使用的关联函数为web_reg_save_param但这两个函数实... 查看详情

ngrinder压力测试脚本groovy实战(代码片段)

前言groovy脚本ngrinder的groovy脚本是顺序结构的,用户可通过编写脚本执行过程中被预置的函数进行用户操作,完成各种复杂的测试工作。ngrinder的进程与线程ngrinder使用进程和线程来模拟多个用户。例如,如果您设置了如下的测试... 查看详情

性能工具之gatling开发环境搭建(代码片段)

文章目录一、前言二、安装插件三、新建工程四、运行结果五、总结一、前言编写Gatling脚本需要搭建脚本开发环境,下面演示使用IDEA开发环境搭建脚本开发环境。二、安装插件打开IDEA,安装scala插件,首次使用,... 查看详情

性能工具之jmeterdubbo脚本开发(代码片段)

...口不带参数请求带参参数请求总结前言ApacheDubbo是一款高性能、轻量级的开源JavaRPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡&# 查看详情

性能工具之locust工具get与post请求(代码片段)

文章目录前言脚本示例总结前言最近在学习Locust性能工具,发现Locust性能工具脚本需要python基础才能写脚本,但是对于性能测试人员来说python是基本功夫。脚本示例在Locust中get脚本怎么写,为了方便直接在代码运行调... 查看详情

性能工具之locust工具get与post请求(代码片段)

最近在学习locust性能工具,发现locust性能工具脚本需要python基础才能写脚本,但是对于性能测试人员来说python是基本功夫。    在locust中get脚本怎么写,为了方便直接在代码运行调试,采用关闭web模式,通过参考官... 查看详情

性能测试之工具对比-ngrinderjmeterloadunner

...具逐步向平台化发展,而且不开源,扩展性不高,收费。nGrinder单节点支持3000并发、支持分布式、可监控被测服务器、可录制脚本、开源、平台化。 查看详情

性能测试工具loadrunner12-lr之virtualusergenerator脚本编写验证步骤

验证脚本比较好的流程:Generate:录制或开发脚本SUSI(SingleUserSingleIteration,单用户单循环):运行录制生成的脚本,解决可能存在的关键问题SUMI(SingleUserMultiIterations,单用户多循环):参数化脚本,在Run-time中设置Iteration,再次运... 查看详情

性能工具之locust工具get与post请求(代码片段)

文章目录前言脚本示例总结前言最近在学习Locust性能工具,发现Locust性能工具脚本需要python基础才能写脚本,但是对于性能测试人员来说python是基本功夫。脚本示例在Locust中get脚本怎么写,为了方便直接在代码运行调... 查看详情

性能工具之jmeter微信小程序websocket脚本入门(代码片段)

文章目录前言准备demoJMeter压测总结前言今天试着写了写小程序聊天页面中的信息底层是怎么实现的,而WebSocket协议,客户端和服务端都可以主动的推送消息,只要建立链接就能推送消息。准备demo前置条件,需要... 查看详情

性能工具之jmeter微信小程序websocket脚本入门(代码片段)

文章目录前言准备demoJMeter压测总结前言今天试着写了写小程序聊天页面中的信息底层是怎么实现的,而WebSocket协议,客户端和服务端都可以主动的推送消息,只要建立链接就能推送消息。准备demo前置条件,需要... 查看详情

性能测试——ngrinder的简易使用

目录一、nGrinder简介二、下载三、使用(一)生成脚本1、点击菜单栏的脚本进行新建脚本2、根据url内容进行填写3、创建并验证脚本,验证通过后将其保存(二)执行脚本进行压测1、选择脚本进行参数配置2、... 查看详情

性能测试工具loadrunner13-lr之virtualusergenerator创建java脚本

...写释放资源的内容适用范围1.不太适合录制的业务功能点性能测试:如视频播放、http文件下载2.利用java语言开发的应用系统&nbs 查看详情

性能工具之gatling快速入门(代码片段)

...快速执行六、总结一、介绍Gatling是一款基于Scala开发的高性能服务器性能测试工具,它主要用于对服务器进行负载等测试,并分析和测量服务器的各种性能指标。它拥有以下特点:支持AkkaActors和AsyncIO,从而能达... 查看详情