Java Request
使用比较频繁的一个取样器,一般接口测试,用这个足够(特殊要求除外)。
此取样器允许操作实现了org.apache.jmeter.protocol.java.sampler.JavaSamplerClient接口或者继承AbstractJavaSamplerClient抽象类的java类。通过接口的实现,可以使用jmeter控制多线程、输入参数、数据收集。
注意
实现JavaSamplerClient接口,需要复写的方法:
public SampleResult runTest(JavaSamplerContext context) {}
public void setupTest(JavaSamplerContext context) {}
public void teardownTest(JavaSamplerContext context) {}
public Arguments getDefaultParameters() {}
继承AbstractJavaSamplerClient这个抽象类,那么只需要复写你需要的方法即可。
1、先来UI看看长啥样
2、写一个java请求
public class JmeterAcceptGOODetailList extends AbstractJavaSamplerClient {
ClassPathXmlApplicationContext context = null;
GuestOrderOutboundFacade guestOrderOutboundFacade =null;
JmeterAcceptGOODetailList jmeterAcceptGOODetailList = null;
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("khddid", "");
params.addArgument("bz", "");
params.addArgument("khddmxid", "");
params.addArgument("mxbz", "");
return params;
}
public void setupTest(JavaSamplerContext arg0) {
context = new ClassPathXmlApplicationContext(new String[] { "classpath:META-INF/dd-frame/spring/master-service-consumer.xml" });
context.start();
guestOrderOutboundFacade = (GuestOrderOutboundFacade) context.getBean("guestOrderOutboundFacade"); // 获取远程服务代理
jmeterAcceptGOODetailList = new JmeterAcceptGOODetailList();
}
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
SampleResult sr = new SampleResult();
sr.setSampleLabel( "GuestOrderOutboundFacade.acceptGOODetailList");
try {
List<MainChildListBean<DdglKhdd,List<DdglKhddmx>>> mainChildListBeanList = new ArrayList<MainChildListBean<DdglKhdd,List<DdglKhddmx>>>();
sr.sampleStart();
jmeterAcceptGOODetailList.fitTogether(mainChildListBeanList,javaSamplerContext);
ResponseInfo responseInfo =(ResponseInfo)guestOrderOutboundFacade.acceptGOODetailList(mainChildListBeanList);
sr.setResponseData("from provider:"+responseInfo.getResultMsg(), null);
sr.setDataType(SampleResult.TEXT);
if(responseInfo.errcode==0){
sr.setSuccessful(true);
}else{
sr.setSuccessful(false);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
sr.sampleEnd();// jmeter 结束统计响应时间标记
}
return sr;
}
//测试结束时调用;
public void teardownTest(JavaSamplerContext arg0) {
//context.destroy();
}
private void fitTogether(List<MainChildListBean<DdglKhdd,List<DdglKhddmx>>> mainChildListBeanList,JavaSamplerContext javaSamplerContext){
//组织入参参数,此处略……
}
}
实现JavaSamplerClient接口,看看长啥样就行了,不写实际的例子了
package com.dangdang.dubbo.util;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
public class JavaSamplerClientTest implements JavaSamplerClient {
@Override
public Arguments getDefaultParameters() {
// TODO Auto-generated method stub
return null;
}
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public void setupTest(JavaSamplerContext arg0) {
// TODO Auto-generated method stub
}
@Override
public void teardownTest(JavaSamplerContext arg0) {
// TODO Auto-generated method stub
}
}
然后导出可执行jar,放入$jmeter_home/lib/ext/中(默认情况下,若配置了userlibpath,可以放在指定位置)
注意:为什么是可执行jar而不用普通jar?
可执行jar,会把依赖的jar包同时导出,运行程序时关联一下jar包,组成一个完整的运行环境;普通jar包,如果需要运行写的程序,需要手工配置依赖jar,你说那个简单~
3、在测试计划中导入依赖jar包
4、创建java请求
5、剩下的就是配置运行了~
配置线程组、配置参数化、配置负载机…… action!
BeanShell Sampler
beanshell是一个轻量级的脚本语言,具体教程可以参考 beanshell docs
根据官网的描述,大致可以总结为
BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;一种松散类型的脚本语言;用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性;执行标准Java语句和表达式,另外包括一些脚本命令和语法
beanshell提供了内置变量,通过这些变量与JMeter进行交互 BeanShell Listener
- log:写入信息到jmeber.log文件
- ctx:该变量引用了当前线程的上下文
- vars - JMeterVariables操作jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁
- vars.get(String key):从jmeter中获得变量值
- vars.put(String key,String value):数据存到jmeter变量中
- vars.putObject(“OBJ1”,new Object());
- props - JMeterProperties - class java.util.Properties操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。
- props.get(“START.HMS”) START.HMS为属性名,在文件jmeter.properties中定义
- props.put(“PROP1”,“1234”);
- SampleResult - Sampler:提供对前一个取样器结果的访问
- Label - 取样器标签
- FileName - 文件名称
- Parameters - 入参列表
- bsh.args - 入参变量数组类似java main中的args
- SampleResult - SampleResult
- ResponseCode:默认是200
- ResponseMessage:默认是ok
- IsSuccess:默认是true
vars.put("secondParam","我是后来加入的");
source("c:\\A.java");
A aInstance = new A();
int result=aInstance.add(1,1);
vars.put("thirdExp","我是调用外部类的结果:"+result);
vars.put("var","我是调用入参:"+bsh.args[0]);
vars.put("var1","我是调用入参:"+bsh.args[1]);
vars.put("var2","我是调用入参:"+bsh.args[2]);
log.info("我是log测试");
log.info("SampleResult.ResponseCode:"+SampleResult.ResponseCode);
log.info("SampleResult.ResponseMessage:"+SampleResult.ResponseMessage);
log.info("Parameters:"+Parameters);
log.info("Lable:"+Label);
log.info("START.HMS:"+props.get("START.HMS"));
log.info("ctx.getThreadNum():"+ctx.getThreadNum());
复杂一点的例子,浏览器例子
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import java.awt.event.*;
import java.awt.*;
JFrame browser( startingUrl ) {
invoke( method, args ) {}
windowClosing(WindowEvent we) {
we.getWindow().setVisible(false);
}
setPage( url ) {
try {
pane.setPage( url );
} catch(Exception e) {
statusBar.setText("Error opening page: "+url);
}
}
hyperlinkUpdate( HyperlinkEvent he ) {
type = he.getEventType();
if (type == HyperlinkEvent.EventType.ENTERED) {
pane.setCursor(
Cursor.getPredefinedCursor( Cursor.HAND_CURSOR) );
statusBar.setText(he.getURL().toString());
} else
if (type == HyperlinkEvent.EventType.EXITED) {
pane.setCursor( Cursor.getDefaultCursor() );
statusBar.setText(" ");
} else {
setPage( he.getURL() );
if (urlField != null)
urlField.setText(he.getURL().toString());
}
}
frame = new JFrame("Browser");
frame.setSize(400,300);
frame.addWindowListener( this );
urlPanel = new JPanel();
urlPanel.setLayout(new BorderLayout());
urlField = new JTextField(startingUrl);
urlPanel.add(new JLabel("Site: "), BorderLayout.WEST);
urlPanel.add(urlField, BorderLayout.CENTER);
statusBar = new JLabel(" ");
pane = new JEditorPane();
pane.setEditable(false);
setPage( startingUrl );
jsp = new JScrollPane(pane);
frame.getContentPane().add(jsp, BorderLayout.CENTER);
frame.getContentPane().add(urlPanel, BorderLayout.SOUTH);
frame.getContentPane().add(statusBar, BorderLayout.NORTH);
// This is the equivalent of an inner class in bsh.
urlTextHandler() {
actionPerformed(ActionEvent ae) {
setPage( ae.getActionCommand() );
}
return this;
}
urlField.addActionListener( urlTextHandler() );
pane.addHyperlinkListener( (HyperlinkListener)this );
return frame;
}
browser = browser("http://www.baidu.com/");
browser.show();
jmeter应用—测试元件介绍(一)
jmeter应用—测试元件介绍(二)
jmeter应用—测试元件介绍(三)
jmeter应用—测试元件介绍(四)
原文链接 http://blog.csdn.net/yue530tomtom/article/details/78626187