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

  前面有提到提到过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. Python IDLE theme

    #转自 http://www.2cto.com/os/201507/418532.html #win10+python3.5.2 #保护视力 .idlerc 目录下新建名为 config-highli ...

  2. MySQL Session--批量KILL会话

    使用SELECT INTO OUTFILE+SOURCE批量KILL ## 查看kill_id文件是否存在 SYSTEM cat /tmp/kill_id.sql ## 如果文件存在,则先删除 sys ...

  3. 00centos安装

    CentOS6.9及CentOS7.4的安装详细步骤 安装前的准备工作:1 VMware已经安装好2 镜像文件下载好(在这里,我用的是CentOS-6.9-x86_64-bin-DVD1.iso和Ce ...

  4. 关于 php 和 python 的浮点计算 0.1+0.2

    关于 php 和 python 的浮点计算 0.1+0.2 看到群里有小伙伴说为什么 python 计算出 0.1+0.2 是 0.30000000000000004 >>> pri ...

  5. Spring+SpringMVC+mybatis框架整合

    1.jdbc.properties 1 driverClassName=com.mysql.jdbc.Driver 2 url=jdbc\:mysql\://127.0.0.1\:3306/slsal ...

  6. 怎么控制contenteditable的输入

    contenteditable是所有流浪器都支持的属性, 可以利用标签模拟文本域, 实现体验相当不错的内容跟着高度自动增高的体验, 但是也带来一些问题, 就是可以直接复制带有style样式的标签进去 ...

  7. 将 vue 挂在 window 对象上,实现能调用 elementUI 的组件

    html 部分: <div id="sample"> </div> js 部分(将js代码放在 body 的 onload事件中: <body onl ...

  8. 【java】Hello World

    class Demo { //程序的主入口,能保证类的独立运行 public static void main(String[] args) { System.out.println("He ...

  9. 阅读 RAM-Based Shift Register(ALTSHIFT_TAPS) IP Core User Guide

    阅读 RAM-Based Shift Register(ALTSHIFT_TAPS) IP Core User Guide 说明:本文档自带测试工程: DE_ALTSHIFT_TAPS.zip 1.支 ...

  10. win764位系统上让32位程序能申请到4GB内存方法

    win764位系统上让32位程序能申请到4GB内存方法. 2016年09月18日 18:36:26 阅读数:1550 最近测试一个32位程序总是在1.2G左右内存时崩溃,怀疑是内存申请失败,本身32位 ...