fireatice 发表于 2015-11-16 16:46:33

Jmeter测试java请求的代码问题,求教

初学,照着网上抄了个例子:
服务类:
package com.test.webservice;

public class Hello {
    public int sum(int a, int b){
      return a + b;
    }

}


测试类:
package com.test.webservice;

import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;

public class PerfTest extends AbstractJavaSamplerClient {
    private String a;
    private String b;
    private String resultData;
   
    // 这个方法是用来自定义java方法入参的。
    // params.addArgument("num1","");表示入参名字叫num1,默认值为空。
    //设置可用参数及的默认值;
    //已设置的参数会显示到Jmeter的参数列表中
    public Arguments getDefaultParameters(){
      Arguments params = new Arguments();
      params.addArgument("num1","");
      params.addArgument("num2","");
      return params;
    }
   
    //每个线程测试前执行一次,做一些初始化工作;
    public void setupTest(JavaSamplerContext arg0) {
    }
   
    //开始测试,从arg0参数可以获得参数值;
    public SampleResult runTest(JavaSamplerContext arg0){
      a = arg0.getParameter("num1");
      b = arg0.getParameter("num2");
      SampleResult sr = new SampleResult();
      sr.setSampleLabel("Java请求测试!");
      try{
            sr.sampleStart();
            Hello test = new Hello();
            resultData = String.valueOf(test.sum(Integer.parseInt(a), Integer.parseInt(b)));
            if(resultData != null && resultData.length() > 0){
                sr.setResponseData("结果是:" + resultData, null);
                sr.setDataType(SampleResult.TEXT);
            }
            System.out.println(resultData);
            sr.setSuccessful(true);
      }catch (Throwable e){
            sr.setSuccessful(false);
            e.printStackTrace();
      }finally{
            sr.sampleEnd();
      }
      return sr;
    }
   
    //测试结束时调用;
    public void teardownTest(JavaSamplerContext arg0) {
      // System.out.println(end);
      // System.out.println("The cost is"+(end-start)/1000);
    }
   
    // main只是为了调试用,最后打jar包的时候注释掉。
   
      public static void main(String[] args)
      { // TODO Auto-generated method stub
          Arguments params = new Arguments();
          params.addArgument("num1", "1");//设置参数,并赋予默认值1
          params.addArgument("num2", "2");//设置参数,并赋予默认值2
          JavaSamplerContext arg0 = new JavaSamplerContext(params);
          PerfTest test = new PerfTest();
          test.setupTest(arg0);
          test.runTest(arg0);
          test.teardownTest(arg0);
      }
   
}


当运行main方法进行调试时报错,报错如下:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/jorphan/logging/LoggingManager
    at org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient.<clinit>(AbstractJavaSamplerClient.java:55)
Caused by: java.lang.ClassNotFoundException: org.apache.jorphan.logging.LoggingManager
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

请问为啥在eclipse里面不能用main方法进行调试呢?是要导入什么包吗??代码并没有报错呀。


gaha 发表于 2015-11-16 17:17:43

概念弄混了,你test的那部分是junit的,需要在junit的代码上邮件 run as执行,junit的class是独立的,不能被main调用。你要尝试用jmeter测试java请求,用我昨天给你的那个连接里写的办法。

fireatice 发表于 2015-11-16 17:48:06

gaha 发表于 2015-11-16 17:17
概念弄混了,你test的那部分是junit的,需要在junit的代码上邮件 run as执行,junit的class是独立的,不能 ...

好的,我看看,谢谢

fireatice 发表于 2015-11-16 18:00:47

gaha 发表于 2015-11-16 17:17
概念弄混了,你test的那部分是junit的,需要在junit的代码上邮件 run as执行,junit的class是独立的,不能 ...

在eclipse里写了一个java方法来调用一个POST接口,类似上面的,打包后在jmeter中添加java请求,执行后,得到了响应数据,而且响应数据也正确了(除了中文显示为乱码)。但是jmeter显示的执行状态是警告,聚合报告中的请求失败率为100%,这是什么情况呢??是因为乱码的影响吗?

gaha 发表于 2015-11-16 21:30:40

fireatice 发表于 2015-11-16 18:00
在eclipse里写了一个java方法来调用一个POST接口,类似上面的,打包后在jmeter中添加java请求,执行后, ...

需要具体看警告的内容,实验的话先用字母吧,获取响应需要过滤器处理编码问题,以后再考虑解决,先把业务调通。

fireatice 发表于 2015-11-17 10:54:47

gaha 发表于 2015-11-16 21:30
需要具体看警告的内容,实验的话先用字母吧,获取响应需要过滤器处理编码问题,以后再考虑解决,先把业务 ...

是个实际的系统接口,请求响应的数据也是对的,就只有中文乱码了,没有报错,就是聚合报告显示请求失败。

gaha 发表于 2015-11-17 11:10:48

fireatice 发表于 2015-11-17 10:54
是个实际的系统接口,请求响应的数据也是对的,就只有中文乱码了,没有报错,就是聚合报告显示请求失败。 ...

我觉得,看不到业务流和所有的错误提示,还是不好判断。先用一个简单的class测试一下使用方法,然后把你这个获取一个没有中文编码的class。
因为jmeter直接压class,不经过过滤器,所以有编码不一致的问题不好说。

fireatice 发表于 2015-11-17 11:42:12

gaha 发表于 2015-11-17 11:10
我觉得,看不到业务流和所有的错误提示,还是不好判断。先用一个简单的class测试一下使用方法,然后把你 ...

请求的响应数据只有中文乱码算不正确,其他完全是正确了的,这应该说明请求发送到了接口并且也获得了正确的响应,但为啥聚合报告还显示请求失败呢?莫非就是因为乱码的问题??我也没加断言啊。

gaha 发表于 2015-11-17 11:45:09

…… 方法已经调通了,你只贴一个响应信息,没有请求状态,怎么知道是提示的什么错误或警告的什么内容啊……你先用简单的尝试,只告诉你在jmeter里压class的方法,这个方法成功了,具体验证出什么结果,就是你的业务内容了。明白否?

fireatice 发表于 2015-11-17 14:05:24

写了一个简单的方法,返回两个整数相加的和,利用jmeter的java请求可以成功。图中中间那个java请求就是。

另外,将同一个接口,直接使用http请求进行测试是可以成功的,如图正常数据,而用java请求去测那个接口的时候,取样器结果中没有获取到response信息,莫非是因为这个才提示请求失败的?jmeter并没有错误信息与警告内容。就只是一个叹号。

gaha 发表于 2015-11-17 19:47:31

fireatice 发表于 2015-11-17 14:05
写了一个简单的方法,返回两个整数相加的和,利用jmeter的java请求可以成功。图中中间那个java请求就是。
...

如果两个访问的目标不是一个的话(我想应该不是一个),问题是出在了ajax的那个状态页了。
ajax在实现的时候实际是异步返回了一个页面上的一段内容,出错的那个ajax状态页是GBK编码,正确的那个是UTF-8。
按你的接口地址,打开那个页面,你可以看源代码,看看是不是两个不一样,具体ajax可以再问问你们开发。

fireatice 发表于 2015-11-19 09:57:37

gaha 发表于 2015-11-17 19:47
如果两个访问的目标不是一个的话(我想应该不是一个),问题是出在了ajax的那个状态页了。
ajax在实现的 ...

没进展了,完全一样的接口,一样的参数,理应是一样的。能通一个就先用一个吧。感谢回复。

gaha 发表于 2015-11-19 10:03:38

fireatice 发表于 2015-11-19 09:57
没进展了,完全一样的接口,一样的参数,理应是一样的。能通一个就先用一个吧。感谢回复。

只能靠你自己了,还是要仔细研究,究竟有什么不一样的地方。

fireatice 发表于 2015-11-19 10:17:23

嗯。多谢及时回复,后面再慢慢分析了。现在有能测试的方法就先用着。

o蜗牛快跑o 发表于 2015-12-26 18:00:28

这个是编写java请求实现javaSampler的标准实现方法,那里用到junit,刚开始就进入别人误区
你用main(),执行没问题,问题在于你少加载了依赖包,你可以把jmeterhome/ lib下所有jar加载到eclipse环境变量中试试

java请求,灵活写法看看这个文章
http://blog.csdn.net/musen518/article/details/50237037

希望对你有帮助
页: [1]
查看完整版本: Jmeter测试java请求的代码问题,求教