• Jmeter扩展---自定义取样器


    简介

    Jmeter已经内置了各种协议的取样器,已经能满足常用的性能压测需求。且在前面一章Jmeter扩展开发--自定义java取样器-CSDN博客中也有关于Java取样器的扩展开发,不过有时候我们期望能定制自己的取样器和界面。为此,需要对Jmeter做扩展,自定义取样器开发

    依赖&打包

    基本的依赖和打包可以查看前一章Jmeter扩展开发--自定义java取样器-CSDN博客

    效果

    自定义取样器的使用效果如下图所示:

    如上图,成功编写自定义取样器之后,打包,将相关jar包放置在:Jmeter安装目录/lib/ext目录,重启Jmeter即可,当选择某个自定义插件之后,实例界面如下:

    核心代码简介

    在自定义取样器开发中有两个类需要重点介绍

    org.apache.jmeter.samplers.gui.AbstractSamplerGui  

    该类是自定义Jmeter取样器的ui显示类,可以直接像操作Swing一样编辑Jmeter取样器的ui界面,如上图2所示。该类包含如下重要方法介绍如下:

    getStaticLabel

    自定义取样器在Jmeter界面上显示的名字如下图:

    示例代码如下:

    1. public String getStaticLabel() {
    2. return "YC http请求";
    3. }
    getLabelResource

    同上,取样器名称的本地化方法,返回一样即可(其实上层组件调用的是getStaticLabel方法获取取样器名称,如果没有国际化的处理,直接放回相同即可)

    1. public String getLabelResource() {
    2. return "YC http请求";
    3. }
    createTestElement

    该方法会创建一个AbstractSampler对象返回即可,必须对该对象中的字段做赋值的动作一般的即是一个ui字段对应一个AbstractSampler字段即可,示例代码如下:

    1. public TestElement createTestElement() {
    2. YcSample ycSample = new YcSample();
    3. ycSample.setUserName(this.userNameField.getText());
    4. ycSample.setAddress(this.addressField.getText());
    5. ycSample.setAge(this.ageField.getText());
    6. ycSample.setScore(this.scoreField.getText());
    7. return ycSample;
    8. }
    modifyTestElement

    该方法是将UI界面上配置的信息,传递给执行测试Samper对象完成测试,其实就是将界面上传递的参数传递给sampler,完成数据传递的过程,一般的,通过ui界面的字段取值,然后设置到sampler对应的字段值上去即可,实例代码如下:

    1. public void modifyTestElement(TestElement element) {
    2. YcSample ycSample = (YcSample)element;
    3. ycSample.setUserName(this.userNameField.getText());
    4. ycSample.setAddress(this.addressField.getText());
    5. ycSample.setAge(this.ageField.getText());
    6. ycSample.setScore(this.scoreField.getText());
    7. }
    构造器

    ui的核心方法是构造器的,在构造器中可以直接使用Swing的方法构建ui界面即可,示例方法如下:

    1. public YcHttpGui() {
    2. super(); // 此处一定要先调用父类构造器
    3. setLayout(new BorderLayout());
    4. setBorder(makeBorder());
    5. add(makeTitlePanel(), BorderLayout.NORTH);
    6. JPanel mainPanel = new VerticalPanel();
    7. add(mainPanel, BorderLayout.CENTER);
    8. JPanel jPanel = new JPanel();
    9. jPanel.setLayout(new GridLayout(2,3));
    10. jPanel.add(userNameField);
    11. jPanel.add(addressField);
    12. jPanel.add(ageField);
    13. jPanel.add(scoreField);
    14. VerticalPanel verticalPanel = new VerticalPanel();
    15. verticalPanel.add(jPanel);
    16. TitledBorder border = BorderFactory.createTitledBorder("用户信息");
    17. verticalPanel.setBorder(border);
    18. mainPanel.add(verticalPanel);
    19. }

    以上基本是一些ui定式,如果还需要其他的ui元素,添加即可

    org.apache.jmeter.samplers.AbstractSampler

    该类是自定义Jmeter取样器的逻辑运行类,核心方法之后一个sample,说明如下
    sample

    该方法是自定义取样器的核心逻辑运行方法,只需要返回一个SampleResult对象即可(此处和扩展java取样器逻辑一样),示例代码如下:

    1. public SampleResult sample(Entry e) {
    2. SampleResult result = new SampleResult();
    3. result.sampleStart();
    4. log.info("userName is:{}",this.userName);
    5. System.out.println("运行时名称是:" + this.userName);
    6. result.sampleEnd();
    7. result.setSuccessful(true);
    8. result.setSamplerData("this is test!");
    9. result.setResponseCode("200");
    10. return result;
    11. }

    完整代码

    自定义Jmeter取样器UI完整代码如下:

    1. import org.apache.jmeter.gui.util.VerticalPanel;
    2. import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
    3. import org.apache.jmeter.testelement.TestElement;
    4. import org.apache.jorphan.gui.JLabeledTextField;
    5. import javax.swing.*;
    6. import javax.swing.border.TitledBorder;
    7. import java.awt.*;
    8. public class YcHttpGui extends AbstractSamplerGui {
    9. private JLabeledTextField userNameField = new JLabeledTextField("用户名");
    10. private JLabeledTextField addressField = new JLabeledTextField("地址");
    11. private JLabeledTextField ageField = new JLabeledTextField("年龄");
    12. private JLabeledTextField scoreField = new JLabeledTextField("score");
    13. public YcHttpGui() {
    14. super(); // 此处一定要先调用父类构造器
    15. setLayout(new BorderLayout());
    16. setBorder(makeBorder());
    17. add(makeTitlePanel(), BorderLayout.NORTH);
    18. JPanel mainPanel = new VerticalPanel();
    19. add(mainPanel, BorderLayout.CENTER);
    20. JPanel jPanel = new JPanel();
    21. jPanel.setLayout(new GridLayout(2,3));
    22. jPanel.add(userNameField);
    23. jPanel.add(addressField);
    24. jPanel.add(ageField);
    25. jPanel.add(scoreField);
    26. VerticalPanel verticalPanel = new VerticalPanel();
    27. verticalPanel.add(jPanel);
    28. TitledBorder border = BorderFactory.createTitledBorder("用户信息");
    29. verticalPanel.setBorder(border);
    30. mainPanel.add(verticalPanel);
    31. }
    32. @Override
    33. public String getStaticLabel() {
    34. return "YC http请求";
    35. }
    36. @Override
    37. public String getLabelResource() {
    38. return "YC http请求";
    39. }
    40. @Override
    41. public TestElement createTestElement() {
    42. YcSample ycSample = new YcSample();
    43. ycSample.setUserName(this.userNameField.getText());
    44. ycSample.setAddress(this.addressField.getText());
    45. ycSample.setAge(this.ageField.getText());
    46. ycSample.setScore(this.scoreField.getText());
    47. return ycSample;
    48. }
    49. @Override
    50. public void modifyTestElement(TestElement element) {
    51. YcSample ycSample = (YcSample)element;
    52. ycSample.setUserName(this.userNameField.getText());
    53. ycSample.setAddress(this.addressField.getText());
    54. ycSample.setAge(this.ageField.getText());
    55. ycSample.setScore(this.scoreField.getText());
    56. }
    57. }

    自定义Jmeter取样器sampler完整代码如下:

    1. import lombok.Data;
    2. import lombok.extern.slf4j.Slf4j;
    3. import org.apache.jmeter.samplers.AbstractSampler;
    4. import org.apache.jmeter.samplers.Entry;
    5. import org.apache.jmeter.samplers.SampleResult;
    6. @Data
    7. @Slf4j
    8. public class YcSample extends AbstractSampler {
    9. private String userName;
    10. private String address;
    11. private String age;
    12. private String score;
    13. @Override
    14. public SampleResult sample(Entry e) {
    15. SampleResult result = new SampleResult();
    16. result.sampleStart();
    17. log.info("userName is:{}",this.userName);
    18. System.out.println("运行时名称是:" + this.userName);
    19. result.sampleEnd();
    20. result.setSuccessful(true);
    21. result.setSamplerData("this is test!");
    22. result.setResponseCode("200");
    23. return result;
    24. }
    25. }

    后续会继续分享关于Jmeter自定义取样器的源码分析,届时会把相关逻辑梳理清楚

  • 相关阅读:
    图像识别学习笔记
    ardupilot 中电机输出逻辑及电机转轴状态分析
    用python实现音乐下载
    MongoDB索引覆盖查询
    pat倒数3天
    ai电销机器人的语音识别是如何实现的呢?
    Chapter 6 Shell Logic and Arithmetic
    java面试题(十五道)
    【Flutter】【widget】Checkbox 和 CheckboxListTile 复选框快速学习一下
    顾客为什么不到店了
  • 原文地址:https://blog.csdn.net/qq_39203337/article/details/136708268