Jmeter可以帮助我们做_如何创建一个自定义的jmeter sampler">
当前位置:   article > 正文

Jmeter Sampler (取样器插件开发) 制定自己的 Sampler_如何创建一个自定义的jmeter sampler

如何创建一个自定义的jmeter sampler

Jmeter可以帮助我们做性能测试、接口测试,然而Jmeter支持常用的HTTP等协议,如果某个公司采用自由协议那么Jmeter要采用实现【JavaSamplerClient】接口,这种方式当然是比较好的,但是有些东西和Jmeter自身的参数化等等功能,不太好结合,有的还有BUG,当然这个最灵活的,当然也可以采取做一个协议插件,嵌入到Jmeter中,那么怎么做呢?

1. 首先第一个做一个测试的GUI,要实现AbstractSamplerGui 类做才能被Jmeter加载


  1. public class DemoSampleGui extends AbstractSamplerGui implements ItemListener {
  2. private DemoParamConfigGui demoParamConfigGui;
  3. public DemoSampleGui() { //构造方法初始化
  4. init();
  5. }
  6. /**
  7. * @Descrition初始化
  8. * */
  9. private void init() {
  10. setLayout(new BorderLayout(0, 5));
  11. setBorder(makeBorder());
  12. add(makeTitlePanel(), BorderLayout.NORTH); //设置布局
  13. demoParamConfigGui = new DemoParamConfigGui(); //这里是另外一个面板类,抽出去了,一会单独说
  14. add(demoParamConfigGui, BorderLayout.CENTER);
  15. }
  16. /**
  17. * @Descrition清除页面数据信息
  18. * */
  19. @Override
  20. public void clearGui() {
  21. super.clearGui();
  22. demoParamConfigGui.clear();
  23. }
  24. /**
  25. * @Descrition:配置组装元素信息
  26. * */
  27. @Override
  28. public void configure(TestElement element) {
  29. super.configure(element);
  30. final MySamplerSamplerBase samplerBase = (MySamplerSamplerBase) element;
  31. safParamConfigGui.configure(element);
  32. }
  33. /**
  34. * @Descrition:创建新的元素
  35. * */
  36. @Override
  37. public TestElement createTestElement() {
  38. MySamplerSamplerBase sampler = new MySamplerSamplerBase();
  39. modifyTestElement(sampler);
  40. return sampler;
  41. }
  42. /**
  43. * @Descrition:清除旧的组件,从新创建
  44. * */
  45. @Override
  46. public void modifyTestElement(TestElement sampler) {
  47. sampler.clear();
  48. safParamConfigGui.modifyTestElement(sampler);
  49. this.configureTestElement(sampler);
  50. }
  51. /**
  52. * @Descrition:label信息,也就是创建HTTP请求、JAVA请求
  53. * */
  54. @Override
  55. public String getLabelResource() {
  56. return "mySampler_title";
  57. }
  58. }

Label那个由于Jmeter实现国际化,所以在配置文件里,通过mySampler_title去资源文件里面找的,如果我们想添加自己的需要修改CORE里面的配置文件,增加自己对应的UICODE编码


2.DemoParamConfigGui 类,这个类主要是初始化面板信息,和修改信息用的,我简单列几行代码,下面给最终的截图,这里可以根据自己的要求更改

  1. public class MySamplerParamConfigGui extends JPanel{
  2. public JTextField interfaceName;
  3. public JTextField interfaceAddress;
  4. public JTextField interfaceGroup;
  5. public JTextField interfaceVersion;
  6. public JTextField interfaceMethod; //定义几个页面输入框,这个根据自身需要开发哈,我这个是简单的例子
  7. /**
  8. * @Descrition:初始化面板
  9. * */
  10. private void init() {
  11. setLayout(new BorderLayout(0, 5));
  12. if (displayName) {
  13. setBorder(makeBorder());
  14. add(makeTitlePanel(), BorderLayout.NORTH);
  15. }
  16. // MAIN PANEL
  17. VerticalPanel mainPanel = new VerticalPanel();
  18. JPanel serverPanel = new HorizontalPanel();
  19. serverPanel.add(createInterfaceAddressPanel(), BorderLayout.CENTER);
  20. mainPanel.add(serverPanel);
  21. mainPanel.add(createInterfaceNamePanel());
  22. mainPanel.add(getInterfaceGroupPanel());
  23. mainPanel.add(createInterfaceVersionPanel());
  24. mainPanel.add(createInterfaceMethodPanel());
  25. mainPanel.add(createJarFilePathPanel());
  26. add(mainPanel, BorderLayout.CENTER);
  27. }
  28. /**
  29. * @Descrition:创建文本框信息
  30. * */
  31. private JPanel createInterfaceMethodPanel() { //初始化上面文本对象,这里我列举一个例子,剩下都一下就是信息和布局的区别
  32. interfaceMethod = new JTextField(15);
  33. JLabel label = new JLabel("调用方法:"); // $NON-NLS-1$
  34. label.setLabelFor(interfaceMethod);
  35. JPanel panel = new JPanel(new BorderLayout(5, 0));
  36. panel.add(label, BorderLayout.WEST);
  37. panel.add(interfaceMethod, BorderLayout.CENTER);
  38. return panel;
  39. }


3.Sampler相关的类


  1. public class MySamplerSamplerBase extends AbstractSampler
  2. implements TestStateListener, TestIterationListener, ThreadListener, Interruptible {
  3. // Code ///
  4. public MySamplerSamplerBase() {
  5. setArguments(new Arguments());
  6. }
  7. public void setInterfaceName(String newInterfaceName) {
  8. this.setProperty(InterfaceName, newInterfaceName);
  9. }
  10. public String getInterfaceAddress() {
  11. return getPropertyAsString(InterfaceAddress);
  12. }
  13. public String getInterfaceName() {
  14. return getPropertyAsString(InterfaceName);
  15. }
  16. public void setInterfaceGroup(String newInterfaceGroup) {
  17. this.setProperty(InterfaceGroup, newInterfaceGroup, "");
  18. }
  19. public String getInterfaceGroup() {
  20. return getPropertyAsString(InterfaceGroup, "");
  21. }
  22. public String getInterfaceVersion() {
  23. return getPropertyAsString(InterfaceVersion);
  24. }
  25. public String getInterfaceMethod() {
  26. return getPropertyAsString(InterfaceMethod);
  27. } //这些都是从界面获取数据
  28. /**
  29. * @Descrition:设置参数
  30. * */
  31. public void setArguments(Arguments value) { //设置和获取参数
  32. setProperty(new TestElementProperty(ARGUMENTS, value));
  33. }
  34. /**
  35. * @Descrition:获取参数
  36. * */
  37. public Arguments getArguments() {
  38. return (Arguments) getProperty(ARGUMENTS).getObjectValue();
  39. }
  40. /**
  41. * @Descrition:执行sampler这个非常重要了,是执行sampler的地方
  42. * */
  43. @Override
  44. public SampleResult sample(Entry e) {
  45. return sample();
  46. }
  47. private transient MySamplerAbstractImpl impl; //sampler执行类的抽象类,
  48. /**
  49. * @Descrition:执行sampler
  50. * */
  51. public SampleResult sample() {
  52. SampleResult res = null;
  53. try {
  54. if (impl == null) { //这里面可以做工厂模式,处理不同的协议sampler
  55. impl = new MySamplerTestSampler(this);
  56. List argumentList=getArgumentList(); //获取参数数据,默认的HTTP请求就是在这里组装带参数的URL,传入不同的client的
  57. res = impl.sample(argumentList);
  58. res.setSampleLabel(getName());
  59. }
  60. return res;
  61. } catch (Exception e) {
  62. return errorResult(e, new SampleResult());
  63. }
  64. }
  65. /**
  66. * @Descrition: 这里面组装表格传过来的数据,传LIST过去 ,这里可以任意自己处理数据格式
  67. * */
  68. public List getArgumentList() {
  69. List<MySamplerArgument> list = new ArrayList();
  70. PropertyIterator iter = getArguments().iterator();
  71. while (iter.hasNext()) {
  72. MySamplerArgument item = null;
  73. Object objectValue = iter.next().getObjectValue();
  74. try {
  75. item = (MySamplerArgument) objectValue;
  76. list.add(item);
  77. } catch (ClassCastException e) {
  78. log.warn("Unexpected argument type: " + objectValue.getClass().getName());
  79. item = new MySamplerArgument((Argument) objectValue);
  80. }
  81. }
  82. return list;
  83. }
  84. }

*4.具体sampler执行类,具体的协议请求发起客户端要你自己定义了,集成到Jar包里就行,所有的类编写完成打JAR包扔到Jmeter/lib/ext下
*


  1. public class MySamplerTestSampler extends MySamplerAbstractImpl {
  2. @Override
  3. protected SampleResult sample(List list) { //因为我定时的是list类型 所以这里面是list
  4. SampleResult res = new SampleResult();
  5. SampleResult res = new SampleResult();
  6. System.out.println("list:"+list.toString());
  7. try {
  8. String interfaceAddress = getInterfaceAddress();
  9. System.out.println("interfaceAddress:"+interfaceAddress);
  10. String interfaceName = getInterfaceName();
  11. res.setSamplerData("interfaceAddress:"+interfaceAddress+"interfaceName:"+interfaceName);
  12. res.sampleStart();
  13. res.setResponseData("list参数:"+list.toString(),"UTF-8");
  14. } catch (RuntimeException e) {
  15. res.setResponseCode("500");
  16. res.setSuccessful(false);
  17. res.setResponseMessage(e.toString());
  18. e.printStackTrace();
  19. return res;
  20. } catch (Exception e) {
  21. res.setResponseCode("500");
  22. res.setSuccessful(false);
  23. res.setResponseMessage(e.toString());
  24. e.printStackTrace();
  25. return res;
  26. } finally {
  27. res.sampleEnd();
  28. }
  29. return res;
  30. }
  31. }

5.演示




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/57503
推荐阅读
相关标签
  

闽ICP备14008679号