`

Jmeter自定义函数使用方法

 
阅读更多
编写获取本地和远程图片流的Jmeter自定义函数
代码如下:
package org.apache.functions;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.functions.AbstractFunction;
import org.apache.jmeter.functions.InvalidVariableException;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;

import org.apache.commons.codec.binary.Base64;

public class ImageLocalBase64 extends AbstractFunction {
	// 显示的参数名字
	private static final List<String> desc = new LinkedList();
	// 显示的函数名字
	private static final String KEY = "__ImageLocalBase64";
	// 参数值
	private Object[] values;

	static {
		desc.add("local path for image");
		desc.add("Name of variable in which to store the result (optional)");
	}

	public String execute(SampleResult paramSampleResult, Sampler paramSampler) throws InvalidVariableException {
		String s = null;
		try {
			String url = ((CompoundVariable) this.values[0]).execute();
			url = new String(url.getBytes("UTF-8"), "UTF-8");
			InputStream inStream = new FileInputStream(url);

			byte[] b = ImageUtil.readInputStream(inStream);
			byte[] bs = Base64.encodeBase64(b);
			s = new String(bs);
			return s;
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}

		return s;
	}

	// 获取参数值
	public synchronized void setParameters(Collection<CompoundVariable> paramCollection)
			throws InvalidVariableException {
		// 检查参数,我也搞不懂是毛线意思,NND
		checkMinParameterCount(paramCollection, 1);
		this.values = paramCollection.toArray();
	}

	// 返回函数名字
	public String getReferenceKey() {
		return KEY;
	}

	// 返回参数名字
	public List<String> getArgumentDesc() {
		return desc;
	}
}

package org.apache.functions;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.functions.AbstractFunction;
import org.apache.jmeter.functions.InvalidVariableException;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;

import org.apache.commons.codec.binary.Base64;
  
public class ImageRemoteBase64 extends AbstractFunction {  
    //显示的参数名字  
    private static final List<String> desc = new LinkedList();  
    //显示的函数名字  
    private static final String KEY = "__ImageRemoteBase64";  
    //参数值  
    private Object[] values;  
      
    static {  
        desc.add("URL for remote Image");  
        desc.add("Name of variable in which to store the result (optional)");  
    }  
      
    public  String execute(SampleResult paramSampleResult, Sampler paramSampler)  
            throws InvalidVariableException {  
            String s = null;  
        try {  
            String url = ((CompoundVariable)this.values[0]).execute();  
            s = ImageUtil.getImageFromNetByURL1(url);
            return s;
           

        } catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}  
        return s;  
    }  
  
    //获取参数值  
    public synchronized void setParameters(Collection<CompoundVariable> paramCollection)  
            throws InvalidVariableException {  
        //检查参数,我也搞不懂是毛线意思,NND  
        checkMinParameterCount(paramCollection, 1);  
        this.values = paramCollection.toArray();  
    }  
  
    //返回函数名字  
    public String getReferenceKey() {  
        return KEY;  
    }  
    //返回参数名字  
    public List<String> getArgumentDesc() {  
        return desc;  
    }  
    
    
    
    /**
     * 从输入流中获取数据
     *
     * @param inStream
     *            输入流
     * @return
     * @throws Exception
     */
    public static byte[] readInputStream(InputStream inStream) throws Exception {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        byte[] buffer = new byte[inStream.available()];
        int len = 0;
        while ((len = inStream.read(buffer)) != -1) {
            outStream.write(buffer, 0, len);
        }
        inStream.close();
        return outStream.toByteArray();
    }
      


    
}

package org.apache.functions;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class ImageUtil {

	/**
	 * 根据地址获得数据的字节流
	 *
	 * @param strUrl
	 *            网络连接地址
	 * @return
	 */

	public static String getImageFromNetByURL1(String strUrl) {
		HttpClient httpclient = new DefaultHttpClient();
		HttpGet httpget = new HttpGet(strUrl);
		HttpResponse response;
		String s = null;
		try {
			response = httpclient.execute(httpget);
			HttpEntity entity = response.getEntity();
			if (entity != null) {
				InputStream instream = entity.getContent();
				byte[] b = readInputStream(instream);
				byte[] bs = Base64.encodeBase64(b);
				s = new String(bs);
				return s;
			}
		} catch (ClientProtocolException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		return s;
	}

	/**
	 * 根据地址获得数据的字节流
	 *
	 * @param strUrl
	 *            本地连接地址
	 * @return
	 */
	public static byte[] getImageFromLocalByUrl(String strUrl) {
		try {

			File imageFile = new File(strUrl);
			InputStream inStream = new FileInputStream(imageFile);
			byte[] btImg = readInputStream(inStream);// 得到图片的二进制数据
			return btImg;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 从输入流中获取数据
	 *
	 * @param inStream
	 *            输入流
	 * @return
	 * @throws Exception
	 */
	public static byte[] readInputStream(InputStream inStream) throws Exception {
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		byte[] buffer = new byte[inStream.available()];
		int len = 0;
		while ((len = inStream.read(buffer)) != -1) {
			outStream.write(buffer, 0, len);
		}
		inStream.close();
		return outStream.toByteArray();
	}

	/**
	 * 将图片写入到磁盘
	 *
	 * @param img
	 *            图片数据流
	 * @param fileName
	 *            文件保存时的名称
	 */
	public static void writeImageToDisk(byte[] img, String zipImageUrl) {
		try {
			File file = new File(zipImageUrl);
			FileOutputStream fops = new FileOutputStream(file);
			fops.write(img);
			fops.flush();
			fops.close();
			System.out.println("图片已经写入" + zipImageUrl);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}




将生成的jar包放置到Jmeter的lib\ext目录下。重启Jmeter后再运行--函数助手模块能够看到自定义的两个函数。
使用时可以用如下方式引用:
${__ImageRemoteBase64(${photoPath},)
其中${photoPath}通过CSV Data Set Config参数化得到的远端图片路径。


心得:
1、httpclient 可以自动对URL字符串中的中文编码进行转码,减少了URL包含中文导致的图片获取不到问题。
2、Jmeter自定义函数的包名必须要包含“functions”,否则Jmeter发现不了该自定义函数。建议包名:package org.apache.functions
分享到:
评论

相关推荐

    Jmeter自定义函数base64加密实现过程解析

    今天,我们将介绍如何使用 Jmeter 自定义函数实现 base64 加密,并将其应用于实际的测试场景中。 首先,需要创建一个继承自 AbstractFunction 的类,并重写四个方法:execute、setParameters、getReferenceKey 和 ...

    Jmeter 二次开发 函数助手 AES加解密

    JMeter的强大之处在于其可扩展性和自定义性,允许开发者进行二次开发以满足特定需求。本项目“Jmeter 二次开发 函数助手 AES加解密”正是这样一种定制化实践,它旨在增强JMeter的功能,特别是关于数据安全方面的处理...

    ApachJMeter_core-jmeter函数助手可复制.zip

    总的来说,这个知识点展示了如何通过自定义JMeter的源码来扩展其功能,以及如何解决特定使用场景下的不便。对于想要深入理解JMeter工作原理和进行定制开发的用户来说,这是一个非常有价值的实践案例。同时,它也提醒...

    jmeter插件,生成车牌号

    jar包放在jmeter-lib-ext目录下,打开jmeter在函数助手中可以看到。CarId.jar为车牌号生成,需要输入(省会简称(京津冀),市级代码(ABCD));

    JMeter基本使用方法.zip

    **JMeter基本使用方法** Apache JMeter是一款强大的性能测试工具,广泛应用于Web应用的压力测试、负载测试和功能测试。这份资料“JMeter基本使用方法”将带你深入理解JMeter的基础操作,助你在性能测试领域得心应手...

    自定义Sample或者协议完成测试

    3. **测试方法**:对于自定义Sample的测试,通常会采用单元测试、集成测试和系统测试等方法。单元测试主要针对单个函数或模块,集成测试关注多个组件间的交互,系统测试则验证整个系统的功能和性能。可以使用JUnit、...

    Jmeter Bean shell 使用

    在Bean Shell中,可以使用Java语法创建自定义函数。例如,可以在Test Plan中定义一个变量 "hello = kitty",然后在BeanShell Sampler中编写脚本来处理这个变量,改变其值并使用Debug Sampler进行验证。 **4. 引用...

    jmeter参数化5种方式脚本

    jmeter参数化5种方式脚本:用户自定义、函数、csv、数据库、正则提取。还包含post请求,get请求

    apache jmeter 2.10测试工具

    四、如何使用JMeter进行MongoDB和Elasticsearch测试 1. **创建测试计划**:首先,需要在JMeter中创建一个测试计划,设置好虚拟用户数量和循环次数。 2. **添加MongoDB服务器配置**:在测试计划中添加MongoDB配置元件...

    Idea 构建Maven 项目,AES ECB 加解密,二次开发Jmeter

    此外,JMeter的脚本语言BeanShell允许你在测试计划中插入自定义逻辑,尽管对于复杂的需求,推荐使用Java插件。 **文件结构分析** 从文件名称“maven_webapp”来看,这个项目可能是一个Maven构建的Web应用程序。...

    JMeter beanShell修改http请求参数

    在性能测试领域,Apache JMeter 是一款广泛应用的开源工具,用于模拟用户负载并评估服务器、网络或...通过引入自定义函数,获取并解析上一次请求的响应,以及动态构建参数,我们可以有效地模拟实际应用中的各种场景。

    JMeter测试入门指导

    ### JMeter测试入门指导 #### 一、安装JMeter与设定 JMeter是一款开源的压力测试工具,主要用于对静态和动态资源进行性能...以上介绍了JMeter的基本使用方法和进阶技巧,希望对大家在进行Web应用性能测试时有所帮助。

    apache-jmeter-5.1.zip

    11. **自定义函数和变量**:JMeter支持自定义函数和变量,可以实现复杂的逻辑和动态数据生成。 12. **测试计划**:一个测试计划是由多个组件组成的结构,它定义了整个测试场景,包括用户行为、测试逻辑、数据源等。...

    jmeter中文使用手册【书签版】.pdf

    ### jmeter中文使用手册知识点概览 #### 一、引言 **Apache JMeter**是一款完全基于Java的开源工具,专为压力测试和性能测试而设计。它不仅可以用于测试客户端/服务器架构的应用程序,还可以用来测试多种类型的资源...

    jmeter性能安装流程

    通过使用JMeter的函数助手(ctrl + F打开),你可以生成函数调用来创建动态SQL,避免数据库对相同SQL语句的缓存影响测试结果。 3. **配置JDBC连接**: - 添加 -&gt; 配置元件 -&gt; JDBC Connection Configuration。在...

    jmeter软件测试工具

    5. **函数与变量**:JMeter提供了丰富的内置函数和变量,如__Random、__threadNum等,这些可以帮助用户动态生成数据,进行参数化测试,提高测试的灵活性和复用性。 6. **性能测试**:JMeter能够生成大量并发请求,...

    JMeter应用指南—1.0版

    JMeter支持使用内置函数和用户自定义函数来增加测试脚本的灵活性。 - **内置函数**:这些函数以`__`开头,用于避免与用户自定义函数命名冲突。内置函数可以用于非控制器组件的任何字段中,例如:`__regexFunction`...

    apache-jmeter-5.1.1.zip

    10. **可定制性**:JMeter提供了丰富的API和自定义函数,允许开发者根据需求编写自定义代码来扩展其功能。 在使用JMeter 5.1.1时,首先需要解压`apache-jmeter-5.1.1.zip`,然后运行`bin`目录下的`jmeter.bat`...

    jmeter

    4. **可扩展性**:通过插件机制,JMeter可以扩展以支持更多的测试需求,例如图形报告、自定义采样器、监听器和断言。 5. **非图形化测试**:JMeter提供命令行模式,使得脚本化的性能测试自动化成为可能,这对于持续...

Global site tag (gtag.js) - Google Analytics