“技术是业务的支撑”,已经不是第一次听到这句话,因为有各种各样的需求,因此衍生了许多各种各样的技术。共勉!

  前面有提到提到过Jmeter的安装目录结构,也提到Jmeter的常用函数功能,有部分工作使用函数便可以完成,有满足,那肯定是有不满足的,本篇来记录函数的开发。

  先贴内置函数图,该jar包位于${jmeter_home}\lib\ext目录下,ApacheJMeter_functions.jar

  

  有很多熟悉的名字。

  那么就挑一个典型的来反编译一下。Random.class。

  GUI界面显示内容:

  

  前端实现Random函数,定义个三个参数。

  上源码: 

 //
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// package org.apache.jmeter.functions; import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
import org.apache.jmeter.threads.JMeterVariables;
import org.apache.jmeter.util.JMeterUtils; public class Random extends AbstractFunction {
private static final List<String> desc = new LinkedList();
private static final String KEY = "__Random";
private CompoundVariable varName;
private CompoundVariable minimum;
private CompoundVariable maximum; public Random() {
} public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {
long min = Long.parseLong(this.minimum.execute().trim());
long max = Long.parseLong(this.maximum.execute().trim());
long rand = ThreadLocalRandom.current().nextLong(min, max + 1L);
String randString = Long.toString(rand);
if (this.varName != null) {
JMeterVariables vars = this.getVariables();
String varTrim = this.varName.execute().trim();
if (vars != null && varTrim.length() > 0) {
vars.put(varTrim, randString);
}
} return randString;
} public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
this.checkParameterCount(parameters, 2, 3);
Object[] values = parameters.toArray();
this.minimum = (CompoundVariable)values[0];
this.maximum = (CompoundVariable)values[1];
if (values.length > 2) {
this.varName = (CompoundVariable)values[2];
} else {
this.varName = null;
} } public String getReferenceKey() {
return "__Random";
} public List<String> getArgumentDesc() {
return desc;
} static {
desc.add(JMeterUtils.getResString("minimum_param"));
desc.add(JMeterUtils.getResString("maximum_param"));
desc.add(JMeterUtils.getResString("function_name_paropt"));
}
}

  观察这段代码、整体结构大致分为三个部分。

  定义、实现逻辑、返回定义。

  在编写实现函数代码的时候需要注意的几个细节:

    1、包名必须是以functions结尾。

    2、类继承AbstractFunction。

   OK,照猫画虎,编写其中的逻辑:

  

 String result = "";

         try {
int a = Integer.valueOf(str1).intValue();
int b = Integer.valueOf(str2).intValue();
int c = Integer.valueOf(str3).intValue();
result = String.valueOf(addInt(a, b, c));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} if ((localJMeterVariables != null) && (this.values.length > 0)) {
localJMeterVariables.put(str4, result);
} return result;
} private int addInt(int a, int b, int c) {
// TODO Auto-generated method stub
return a + b + c;
}

    三个正整数相加,返回和。

    打包,将jar包放入lib\ext目录下,启动Jmeter

    

  调试一下。

  

  

  像外行一样去思考,像专家一样去实践。

                ----金出武雄

Jmeter(三十二)Jmeter Question 之 “自定义函数开发”的更多相关文章

  1. Jmeter(三十二) - 从入门到精通 - Jmeter Http协议录制脚本工具-Badboy5(详解教程)

    1.简介 这一篇文章,宏哥主要想讲解一下,录制完脚本不是就完事了,我们有时候还需要断言,看结果是否和我们预期的结果一致.这在测试中都是很重要的.用句老话说:只看结果不看过程. 2.录制脚本 想要断言, ...

  2. Jmeter(三十二)_搭建本地接口自动化环境

    我们在学习接口自动化的时候,最理想的状态是在公司有项目可以操作.大部分时候我们并没有可以练习的项目,因此练习接口无从谈起,只能找一些开放的api来练一练,但是这样并不能提高我们的技术.因此我们需要搭建 ...

  3. (三十二)DatePicker和自定义键盘

    DatePicker通过设置Locale属性可以设置语言(注意手机语言也会影响到它的显示). 如果通过代码创建DatePicker,又要设置属性,使用下面的代码,注意locale是个枚举,初始化要填写 ...

  4. Bootstrap <基础三十二>模态框(Modal)插件

    模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果您想要单独引用该插件的功能,那么您需要引用  ...

  5. Java进阶(三十二) HttpClient使用详解

    Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...

  6. (转载)Android项目实战(三十二):圆角对话框Dialog

    Android项目实战(三十二):圆角对话框Dialog   前言: 项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框. 对话框包括:1.圆角 2.app图标 , 提示文本,关闭对话 ...

  7. FreeSql (三十二)Aop

    FreeSql AOP 已有的功能介绍,未来为会根据用户需求不断增强. 审计 CRUD 马云说过,996是修福报.对于多数程序员来说,加班是好事...起码不是闲人,不会下岗. 当如果因为某个 sql ...

  8. 使用Typescript重构axios(三十二)——写在最后面(总结)

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  9. COJ968 WZJ的数据结构(负三十二)

    WZJ的数据结构(负三十二) 难度级别:D: 运行时间限制:5000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,边上均有权值,每个点上有 ...

随机推荐

  1. Map 知识整理

    首先是HashMap的学习,理解散列的概念以及相关的实现,并且会学习HashMap的源码,理解为什么HashMap的速度如此之快. 声明:参考到的资料在下方列出. 1.<Java编程思想> ...

  2. redis 部署相关

    ★ 启动: 配置好环境变量后:打开一个cmd窗口,执行redis-server.exe就可以启动redis了. https://blog.csdn.net/weixin_42423819/articl ...

  3. web网页【2】

    前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.as ...

  4. mongodb备份与还原

    mongodb单机: 备份所有的库: mongodump --host 10.10.7.33:27019 --gzip --out /home/mongodb/0415_bf 备份指定的库: mong ...

  5. linux30道运维面试题

    传送门https://zhangge.net/1986.html

  6. Gravitational Teleport简单使用

    使用官方提供的二进制包进行快速启动测试,详细细节还需要在学习 下载软件包 mac 系统 https://gravitational.com/teleport/download/ wget https: ...

  7. 非递归和递归分别实现求第n个斐波那契数。

    菲波那切数列为:0 1 1 2 3 5 8 13 21 34... 规律:从第三个数字起后面的每一个数字都是前两个数字的和. 非递归算法: #include<stdio.h> int ma ...

  8. JMeter 插件 Json Path 解析 HTTP 响应 JSON 数据(转)

    JMeter 是一个不错的负载和性能测试工具,我们也用来做 HTTP API 接口测试.我们的 API 返回结果为 JSON 数据格式.JSON 简介,JSON 教程. JSON 已经成为数据交换格式 ...

  9. Debian 7.0(Wheezy) 安装配置笔记

    1. 下载光盘镜像 ftp://debian.ustc.edu.cn/debian-cd/7.1.0/amd64/iso-dvd/ [2012.3.25]  1.1 去官网 http://cdimag ...

  10. html文件form表单action调用servlet连接mysql数据库实例

    web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&qu ...