1.打开Java编译器,新建一个项目"TestLength",然后新建一个包"app".
2.从Jmeter的安装目录lib\ext中拷贝两个文件"ApacheJMeter_core.jar" 和"ApacheJMeter_java.jar"到"Tester"的项目中,然后引入这两个JAR文件.(具体的引入方法参考各个Java编译器的使用方法)
3.在"app"包中新建一个类,名字叫"TestLength",不过这个类要继承"AbstractJavaSamplerClient"类,如果项目引入步骤二中的两个文件,就可以找到"AbstractJavaSamplerClient"类了.
4."TestLength"类在继承"AbstractJavaSamplerClient"类的同时也会继承四个方法,分别是"getDefaultParameters","setupTest","runTest"和"teardownTest"方法."getDefaultParameters"方法主要用于设置传入的参数;"setupTest"方法为初始化方法,用于初始化性能测试时的每个线程."runTest"方法为性能测试时的线程运行体;"teardownTest"方法为测试结束方法,用于结束性能测试中的每个线程.
5、把上面的例子打包,然后把生成的"TestLength。jar"文件拷贝到Jmeter的安装目录lib\ext下。
6、运行Jmeter,添加一个线程组,然后在该线程组下面添加一个Java请求(在Sampler中),在Java请求的类名称中选择咱们刚创建的类"app。TestLength",在下面参数列表的"testStr"后面输入要测试的字符串,然后添加一个监听器(聚合报告),设置一下模拟的用户数就可以测试了。如果测试不成功,Jmeter会在它自己个输出框中抛出这个字符串。
通过上面的例子我们可以发现,使用Jmeter自定义Java测试代码,配合Jmeter自带的函数,就可以实现出LoadRunner中"Java Vuser"协议的绝大多数功能。
附上代码:
package cn.gbase.jmeterTest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
/**
*
* @author tianmao
*/
public class JmeterExtendJDBCTest extends AbstractJavaSamplerClient {
private SampleResult results;
private String arg1;
/* Implements JavaSamplerClient.setupTest(JavaSamplerContext) */
public void setupTest(JavaSamplerContext arg0) {
results = new SampleResult();
results.setSamplerData(toString());
results.setDataType("text");
results.setContentType("text/plain");
results.setDataEncoding("UTF-8");
results.setSuccessful(true);
results.setResponseMessageOK();
results.setResponseCodeOK();
arg1 = arg0.getParameter("arg1", "");
if (arg1 != null && arg1.length() > 0) {
results.setSamplerData(arg1);
}
}
/* Implements JavaSamplerClient.teardownTest(JavaSamplerContext) */
public void teardownTest(JavaSamplerContext arg0) {
System.out.println("treaddown");
}
/* Implements JavaSamplerClient.getDefaultParameters() */
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("arg1", "abc"); // 定义一个参数,显示到Jmeter的参数列表中,第一个参数为参数默认的显示名称,第二个参数为默认值
return params;
}
@Override
public SampleResult runTest(JavaSamplerContext context) {
int len = 0;
results.sampleStart(); // 定义一个事务,表示这是事务的起始点,类似于LoadRunner的
// lr.start_transaction
arg1 = context.getParameter("arg1");
doJDBCDeal();
results.sampleEnd(); // 定义一个事务,表示这是事务的结束点,类似于LoadRunner的
// lr.end_transaction
return results;
}
public void doJDBCDeal() {
try {
Class.forName("com.gbase.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection conn = null;
Statement stm = null;
ResultSet rs = null;
String sql = "select * from testView";
try {
conn = DriverManager.getConnection("jdbc:gbase://192.168.1.11/kgdx?user=gbase&password=gbase20110531&connectTimeout=300000");
stm = conn.createStatement();
rs = stm.executeQuery(sql);
results.setResponseCode("testStr:" + arg1);
results.setResponseMessage("aaaaaaaaaaaaaaa");
results.setResponseCode("UTF-8");
results.setResponseCodeOK();
results.setResponseData(("execute:"+ sql+ "\r\n" + rs2Str(rs)).getBytes("utf-8"));
} catch (Exception e) {
results.setSamplerData(e.getMessage());
results.setSuccessful(false); // 用于设置运行结果的成功或失败,如果是"false"则表示结果失败,否则则表示成功
return;
} finally {
try {
if (rs != null)
rs.close();
} catch (SQLException e) {
}
try {
if (stm != null)
stm.close();
} catch (SQLException e) {
}
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
}
}
results.setSuccessful(true);
}
public String rs2Str(ResultSet rs) {
StringBuilder sb = new StringBuilder();
try {
ResultSetMetaData rsmd = rs.getMetaData();
int c = rsmd.getColumnCount();
while (rs.next()) {
sb.append("----------------------------------------------------------").append("\r\n");;
for (int i = 0; i < c; i++) {
sb.append(rsmd.getColumnLabel(i + 1)).append("=").append(rs.getObject(i + 1)).append("\r\n");
}
sb.append("\r\n");
}
} catch (SQLException e) {
e.printStackTrace();
}
return sb.toString();
}
}