jmeter应用---测试元件介绍(三)

来源:互联网 发布:二叉树遍历递归算法 编辑:程序博客网 时间:2024/05/21 19:49

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看看长啥样

java_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请求

demo

5、剩下的就是配置运行了~

配置线程组、配置参数化、配置负载机…… action!

BeanShell Sampler

beahshell是一个轻量级的脚本语言,具体教程可以参考 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());

这里写图片描述

这里写图片描述

这里写图片描述

复杂一点的例子,浏览器例子

simple web browse

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

阅读全文
0 0
原创粉丝点击