如何为Apache JMeter开发插件(五)——监听器之Report (报告)

本文介绍了如何为Apache JMeter开发Report插件,包括监听器组件的作用、SleepTestSampler插件的创建、Report插件的设计以及如何开发类似LoadRunner事务的Sampler组和监听器。通过自定义TransactionSampleResult、TransactionBeginSampler和TransactionEndSampler,实现了事务的定义和监控,并通过TransactionResultReporter展示了结果。
摘要由CSDN通过智能技术生成

JMeter监听器组件

前文介绍过,我们可以从实际用途上将JMeter的Listener(监听器)组件分为两大类Report (报告)和Vizualizers(监视器)。Report (报告)主要用于收集来自于线程组内各个Sampler在进行sample时所产生的结果数据;Vizualizers(监视器)主要用于主动采集一些我们所关心的,最终用于结合Sampler结果数据进行性能瓶颈分析与调优的性能计数(如操作系统CPU利用率、内存使用情况等)。另外,为达到监听效果在GUI层常常会以图表形式对监听到的结果数据进行直观展现,在文件系统层通过格式化后将结果数据进行本地化文件保存。

Report插件开发

Report (报告)继承AbstractListenerElement抽象类,通过实现sampleOccurred(SampleEvent e)方法,对所有采集事件中所产生的SampleResult进行处理,从而生成报告。

一个用于产生结果的SleepTestSampler插件

Sampler插件非常简单,需要的功能是根据配置生成一个sample标签并产生一段sample消耗时间,核心代码参考如下:

public SampleResult sample(Entry entry) {
        SampleResult res = new SampleResult();
        res.sampleStart();
        res.setSampleLabel(this.getPropertyAsString(NAME) + this.getThreadName());
        Random rand = new Random();
        try {
            long defaultValue = (rand.nextInt(5) + 1) * 1000;
            if(this.getPropertyAsString(SLEEP).trim().equals("")){
                Thread.sleep(defaultValue);
            } else {
                Thread.sleep(this.getPropertyAsLong(SLEEP, defaultValue));
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        res.sampleEnd();
        res.setResponseCodeOK();
        res.setSuccessful(true);
        return res;
    }

完成后,效果如下图:

这里写图片描述

从前面的代码可以看出,第一个输入框为产生一个NAME属性,第一个输入框为产生一个SLEEP属性,当SLEEP属性未设置时,将产生一个随机时间。

Report插件

Report插件会监听到所有Sampler在sample时所产生的SampleResult对象,为了甄别我们真正想要收集的结果数据,可以定义一个isSampleWanted方法,收集器Collector的代码参考如下:

public class SamplerResultCollector extends AbstractListenerElement implements SampleListener, Clearable, Serializable,
                                                TestStateListener, Remoteable, NoThreadClone {
   

    public boolean isSampleWanted(boolean success){
        if(success){
            return true;
        }
        return false;
    }

    @Override
    public void testEnded() {

    }

    @Override
    public void testEnded(String host) {

    }

    @Override
    public void testStarted() {

    }

    @Override
    public void testStarted(String host) {

    }

    @Override
    public void clearData() {

    }

    @Override
    public void sampleOccurred(SampleEvent event) {
        SampleResult result = event.getResult();
        if(isSampleWanted(result.isSuccessful())){
            long during = result.getEndTime() - result.getStartTime();
            System.out.println(result.getSampleLabel() + ":" + during + "ms");
        }

    }

    @Override
    public void sampleStarted(SampleEvent event) {

    }

    @Override
    public void sampleStopped(SampleEvent event) {

    }

}

我们收集所有状态为成功的SampleResult,并在收集的同时输出其对应的sample标签和响应时间。
Report的GUI代码参考如下:

public class SamplerResultReporter extends AbstractListenerGui{
   

    @Override
    public TestElement createTestElement() {
        SamplerResultCollector collector = new SamplerResultCollector();
        modifyTestElement(collector);
        return collector;
    }

    @Override
    public String getLabelResource() {
        return this.getClass().getSimpleName();
    }

    @Override
    public String getStaticLabel() {
  //设置显示名称
        return JMeterPluginUtils.prefixLabel("SamplerResultReport");
    }

    @Override
    public void modifyTestElement(TestElement element) {
        super.configureTestElement(element);

    }

    @Override
    public void configure(TestElement element) {
        super.configure(element);
    }

}

完成后,我们创建两个SleepTestSampler,第一个取名为A,固定产生3000毫秒响应时间,第二个取名为B,随机产生响应时间,使用SamplerResultReporter进行监听,10个线程循环2次,效果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值