项目场景:

测试开发工程师自学之路:开发Jmeter自定义函数


问题描述

函数传参时:有一个参数是Json串,
本想着作为一个data参数使用的,但是setParameters自动给按 “,” 分隔存到数组里面了

@Overridepublic void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {Object[] values = parameters.toArray();orgCode = ((CompoundVariable) values[0]).execute();sign_algorithm = ((CompoundVariable) values[1]).execute();data = ((CompoundVariable) values[2]).execute();}

原因分析:

原因没找到,希望有大佬看到能评论下!!!


解决方案:

写了个循环把参数拼起来了

    public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {Object[] values = parameters.toArray();orgCode = ((CompoundVariable) values[0]).execute();sign_algorithm = ((CompoundVariable) values[1]).execute();data = ((CompoundVariable) values[2]).execute();for (int i = 3;i<values.length;i++){data = data +',' +((CompoundVariable) values[i]).execute();}}

获取签值的完整代码如下

"""
本函数最终实现的功能,SHA256withRSA加签 sign_algorithm = 0
和HmacSHA256加签 sign_algorithm = 1
"""
package org.apache.jmeter.functions;
import jdk.nashorn.internal.ir.debug.ASTWriter;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;public class GetSign extends AbstractFunction {//SHA256withRSAprivate static final String KEY_ALGORITHM = "RSA";private static final String SIGNATURE_ALGORITHM = "SHA256withRSA";public static String signByPrivateKey(byte[] data, String privateKey) throws Exception {byte[] keyBytes = decryptBASE64(privateKey);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);// 生成私钥PrivateKey priKey = factory.generatePrivate(keySpec);// 用私钥对信息进行数字签名Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initSign(priKey);signature.update(data);return encryptBASE64(signature.sign());}private static byte[] decryptBASE64(String data) {return Base64.decodeBase64(data);}private static String encryptBASE64(byte[] data) {return new String(Base64.encodeBase64(data));}//HmacSHA256private static String SHA256 = "HmacSHA256";public static String getSign(byte[] bytesToSign, String appSecret) {try {Mac hmacSha256 = Mac.getInstance(SHA256);byte[] keyBytes = appSecret.getBytes("UTF-8");hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, SHA256));return Hex.encodeHexString(hmacSha256.doFinal(bytesToSign)).toUpperCase();} catch (Exception e) {e.printStackTrace();}return "";}private static final String key = "__GetSign";public GetSign() {}public String authorizationCode = "yangoo2021";public String channelCode = "ERP";public String orgCode;public String sign;public String sign_algorithm;public String data;public String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIp9GnQ9928bY7QrZY/oLsz77ad8VkiwhuZCg4fNDv+84Ct1DE1P6oBbF72sTeon5lAycpjRxCxa8GURjkFdcW4/hlao1F1u+yHIyXdm+N4ScHUdr+aohHwJXfWdieZXSqanqGcpvFM9MSAdY4lnzAH/uLj3tSNnuTxvebchYCfxAgMBAAECgYA1iDhSmKVtsGOxAFlo8DIvEG8EH97miD4NAccAFnbmyibJBZy0weB+rzeVHOadTcEMXQPJKMSw9JIaL1gS0kEG7qCrZ3dweaNCFf3kwPzPW0U38Mow4E9s0/bjgDtNH0i8rh6bC//41l8vQ9NTHP1htWgIL96ylktuWJmQCb2ghQJBANpsfaau4e+iOOul3HOXjjEe5dpF92g8GiZXccZyouacFmyWq64gd4SQYmIoay+wzTN0e1MouVJdbEOeb5S7HoMCQQCiUDl5HmtZJs9TMMZyDkCXAf9ptkD/qnGYxhvNzlbd7siXCRxbbtxQXswHyJBbP3J+Vhx6VE36+76rH/WcnVV7AkEAnbg3ZxPi66GtDmO+8uzd7RRNjzZ0dxznGQaNjmmavYC6JIELyPmCtAN6NzzOYSp+kggrQRon75SsJ4uRMMmJNwJADom8/Bo7ZzrQqxTdUW3xXxUwuVk3rS6pChQEfYSTx0ER+mU4gwAE/7Xd9HyEYYfnS2WPG23dpjNSOqWcLDDzbQJAG3sF5FrzU4qQFBTMEdvUmTUt7UOybyV/j1YDuaO71jpgXV56drUeEEUPfkeIlcMHeiqdo83hNkyBk3f/xBEDVA==";public String appSecret = "JveElkIjoiQjEyMjMxMDAwMDAwO";private static List<String> args = new LinkedList<>();static {//        args.add("privateKey:SHA256withRSAUtil需要");
//        args.add("appSecret:HmacSHA256Util需要");
//        args.add("channelCode");args.add("orgCode");
//        args.add("authorizationCode");args.add("sign_algorithm");args.add("data");}@Overridepublic String execute(SampleResult previousResult, Sampler currentSampler) throws Exception {String sign = "";if (orgCode != null) {String requestStr1 = "{\"authorizationCode\":\"" + authorizationCode + "\"," +"\"channelCode\":\"" + channelCode + "\"," +"\"data\":\"" + new String(Base64.encodeBase64(data.getBytes("UTF-8"))) + "\"," +"\"orgCode\":\"" + orgCode + "\"," +"\"sign_algorithm\":\"" + sign_algorithm + "\"}";switch (sign_algorithm) {case "1":sign = getSign(requestStr1.getBytes(), "JveElkIjoiQjEyMjMxMDAwMDAwO");break;case "0":sign = signByPrivateKey(requestStr1.getBytes(), privateKey);break;default:}String reqStr1 = "{\n" +"\"orgCode\":\"" + orgCode + "\"," +"\"channelCode\":\"" + channelCode + "\"," +"\t\"authorizationCode\": \"" + authorizationCode + "\",\n" +"\t\"sign_algorithm\": \"" + sign_algorithm + "\",\n" +"\t\"sign\": \"" + new String(Base64.encodeBase64(sign.getBytes("UTF-8"))) + "\",\n" +"\"data\":\"" + new String(Base64.encodeBase64(data.getBytes("UTF-8"))) + "\"" +"}";return reqStr1;} else {String requestStr2 = "{\"authorizationCode\":\"" + authorizationCode + "\"," +"\"channelCode\":\"" + channelCode + "\"," +"\"data\":\"" + new String(Base64.encodeBase64(data.getBytes("UTF-8"))) + "\"," +"\"orgCode\":\"" + orgCode + "\"," +"\"sign_algorithm\":\"" + sign_algorithm + "\"}";switch (sign_algorithm) {case "1":sign = getSign(requestStr2.getBytes(), "JveElkIjoiQjEyMjMxMDAwMDAwO");break;case "0":sign = signByPrivateKey(requestStr2.getBytes(), privateKey);break;default:}String reqStr1 = "{\n" +"\"orgCode\":\"" + orgCode + "\"," +"\"channelCode\":\"" + channelCode + "\"," +"\t\"authorizationCode\": \"" + authorizationCode + "\",\n" +"\t\"sign_algorithm\": \"" + sign_algorithm + "\",\n" +"\t\"sign\": \"" + new String(Base64.encodeBase64(sign.getBytes("UTF-8"))) + "\",\n" +"\"data\":\"" + new String(Base64.encodeBase64(data.getBytes("UTF-8"))) + "\"" +"}";return reqStr1;}}@Overridepublic void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {Object[] values = parameters.toArray();
//        privateKey = ((CompoundVariable) values[0]).execute();
//        appSecret = ((CompoundVariable) values[1]).execute();
//        channelCode = ((CompoundVariable) values[2]).execute();orgCode = ((CompoundVariable) values[0]).execute();
//        authorizationCode = ((CompoundVariable) values[4]).execute();sign_algorithm = ((CompoundVariable) values[1]).execute();data = ((CompoundVariable) values[2]).execute();for (int i = 3;i<values.length;i++){data = data +',' +((CompoundVariable) values[i]).execute();}}@Overridepublic String getReferenceKey() {return key;}@Overridepublic List<String> getArgumentDesc() {return args;}
}

Jmeter自定义函数开发-------输入参数被分割相关推荐

  1. 自定义函数使用GridSearchCV参数寻优

    自定义函数使用GridSearchCV参数寻优 GirdSearchCV and RandomizedSearchCV 自定义函数中使用GirdSearchCV GridSearchCV参数说明 Gr ...

  2. Jmeter自定义函数和引入外部文件的几种方法

    1.  Bean Shell简介 BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShell是一种松散类型的脚本语言(这点和JS类似); Bean ...

  3. Jmeter自定义函数

    Jmeter内置了一些常用的函数,在Jmeter->选项->函数助手对话框,但是测试过程中这些函数远远不够, 比如:对服务器返回的session信息MD5.Base64加密等,再上传给服务 ...

  4. Go 学习笔记(61)— Go 高阶函数、函数作为一等公民(函数作为输入参数、返回值、变量)的写法

    函数在 Go 语言中属于"一等公民(First-Class Citizen)"拥有"一等公民"待遇的语法元素可以如下使用 可以存储在变量中: 可以作为参数传递给 ...

  5. std输入参数太多matlab,错误使用函数,输入参数太多怎么解决

    请各位大神帮帮忙,实在想不明白问题在哪.我想用二分法求零点,待求函数为HS(t)的调用函数.代码如下 主程序是这个: %二分法迭代求解思路 %初始化 clc cla clear all close a ...

  6. matlab错误使用cd输入参数太多,错误使用函数,输入参数太多怎么解决

    请各位大神帮帮忙,实在想不明白问题在哪.我想用二分法求零点,待求函数为HS(t)的调用函数.代码如下 主程序是这个: %二分法迭代求解思路 %初始化 clc cla clear all close a ...

  7. python strptime函数_关于python:datetime.strptime不接受自定义函数传递的参数

    我正在尝试创建一个可重用的def函数,以将熊猫数据框列中的儒略日期转换为格里高利风格的日期. 使用该函数时,出现TypeError:strptime()参数1必须是str,而不是Series. imp ...

  8. python--plt.hist函数的输入参数和返回值的解释

    函数作用----绘制直方图 函数参数和返回值 n,bins,patches=matplotlib.pyplot.hist( x, bins=10, range=None, normed=False, ...

  9. VS直接调试可执行文件main函数.exe输入参数argc(项目--> 属性--> 调试--> 命令参数)

    #include <stdio.h> using namespace std;int main(int argc, char** argv) {int i;printf("arg ...

最新文章

  1. 通过WMI获得硬盘和CPU的物理序列号(VB.net)
  2. 树剖+线段树||树链剖分||BZOJ1984||Luogu4315||月下“毛景树”
  3. 数据库查询性能优化之利器—索引(二)
  4. PyTorch基础(七)----- torch.nn.AdaptiveAvgPool2d()方法
  5. 干货!Kaggle座头鲸识别落下帷幕,冠军方案解读
  6. 5绘制收银台程序_进来学知识了:实操之C/C++的绘制
  7. 核能版“水变油”登上Nature!谷歌7000万押注,MIT参与,被评争风加水汽车
  8. 【Luogu1363】幻想迷宫
  9. 太强了!这款轻量级中间件几行代码就搞定SpringBoot的分库分表问题
  10. POJ 1155 TELE 树形DP
  11. Samba 实现文件共享
  12. 【校招 --阶段一 操作系统基础】进程地址空间
  13. 利用多线程中线程休眠----sleep实现简单的计时器以及时钟功能
  14. 腾讯收入证明泄漏,税后250万,月均20万...
  15. CSS Cascading Style Sheet 级联样式表1
  16. SSD掉电保护也是一门艺术
  17. dau计算-预测日活
  18. PTA 排序(快速排序,基数排序)
  19. Cookie重名问题处理
  20. sqlite数据库下载安装和初步操作和所遇到的问题near sqlite3:syntax error

热门文章

  1. 阿里云 Teambition 网盘亲测体验,秀翻全网!
  2. UCLA教授朱松纯:走向通用人工智能,从大数据到大任务
  3. APP开发的需求分析主要包括哪些?
  4. 头歌 初识Redis
  5. HTML5 影音 ( Video ) 概論
  6. UI设计中面性图标设计总结
  7. 网站HTPPS加密有什么作用
  8. [Win32] 服务程序开发(1)基本概念和服务程序的框架
  9. matlab roundn函数_columns函数的使用方法 matlab中round函数具体用法
  10. 【数据结构与算法】五、哈希表和链表