这周尝试了一把性能测试,之前都是测试网站的性能测试,java接口的性能测试还是头一次,学到了很多,特此分享一下。
  主要用到了两个性能测试工具,一个是jmeter,一个是LoadRunner
  使用jmeter的测试方法:
  1、下载jemeter的linux版本的,下载的文件里包含了两个jar包,一个是ApacheJMeter_core.jar,ApacheJMter_java.jar。分别把这两个jar放到eclipse的Java Build Path的libraries下面。
  2、创建编写脚本的类,使他继承AbstractJavaSamplerClient。初步结构是
private SampleResult results;
public void setupTest(JavaSamplerContext arg0) {
results = new SampleResult();
}
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
return params;
}
//测试执行的循环体,根据线程数和循环次数的不同可执行多次,类似于LoadRunner中的Action方法
public SampleResult runTest(JavaSamplerContext arg0) {
results.sampleStart();
results.sampleEnd();
results.setSuccessful(true);
return results;
}
//结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行,类似于LoadRunner中的end方法
public void teardownTest(JavaSamplerContext arg0) {
}
 
 
 
将需要循环的业务流程放到runTest方法里。编写好的代码如下:
package app;
import http.HttpClient4;
import http.HttpParameter;
import http.HttpResp;
import http.JsonUtil;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import java.util.Random;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.PostMethod;
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;
import com.yeepay.g3.utils.common.encrypt.AES;
import com.yibao.utils.des3.RSA_Encrypt;
public class TheardTest extends AbstractJavaSamplerClient{
private SampleResult results;
public void setupTest(JavaSamplerContext arg0) {
results = new SampleResult();
}
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
return params;
}
public static String ramdonNum(int num){
Random rd = new Random();
StringBuilder sb = new StringBuilder("");
if (num <1){
return null;
}
else{
for(int i=1;i<=num;i++){
int sr=rd.nextInt(9);
sb.append(String.valueOf(sr));
}
return sb.toString();
}}
public static void testCreditPay() throws ParseException{
String PUBLIC_KEY=TheardTest.testConsult();
HttpClient client = new HttpClient();
PostMethod method = new PostMethod("http://xxxxxxxx/xxxxxx/api/bankcard/credit/pay");
String key=TheardTest.ramdonNum(6);
String encryptkey = "0123456789"+key;
String merchantAccount = "YB01000000078";
//民生
String cardNo ="XXXXXXXXX";
String validthru="xxx7";
String cvv2 = "6xx";
String phone = "13xxxxxx5431";
String orderId = "33hhkssseef3utyt2"+key;
System.out.println(orderId);
Integer transtime = (int)(System.currentTimeMillis()/1000);
Integer currency = 156;
String  amount = "50";
String productcatalog = "1";
String productName = "123";
String productDesc = "小丸子";
String userIp = "123.45.45.45";
String identityId = "a";
Integer identityType = 6;
String other = "eeee";
String data = "{\"merchantaccount\":\"" + merchantAccount
+"\",\"cardno\":\"" + cardNo
+ "\",\"validthru\":\"" + validthru
+ "\",\"cvv2\":\"" + cvv2
+ "\",\"phone\":\"" + phone
+ "\",\"orderid\":\"" + orderId
+ "\",\"transtime\":" + transtime
+ ",\"currency\":" + currency
+ ",\"amount\":" + amount
+ ",\"productcatalog\":\"" + productcatalog
+ "\",\"productname\":\"" + productName
+ "\",\"productdesc\":\"" + productDesc
+ "\",\"userip\":\"" + userIp
+ "\",\"identityid\":\"" + identityId
+ "\",\"identitytype\":" + identityType
+ ",\"other\":\"" + other + "\"}";
data = AES.encryptToBase64(data, encryptkey);
try {
method.setParameter("merchantaccount", merchantAccount);
method.setParameter("data", data);
method.setParameter("encryptkey", RSA_Encrypt.encrypt(encryptkey, PUBLIC_KEY));
client.executeMethod(method);
System.out.println(method.getStatusLine());
String respStr = method.getResponseBodyAsString();
System.out.println(respStr);
String result = AES.decryptFromBase64(respStr, encryptkey);
System.out.println(result);
//                    自动退款
Map<String, Object> mapjson=JsonUtil.parse(result);
Object obj = mapjson.get("yborderid");
String yborderid=obj.toString();
System.out.println("流水号:"+yborderid);
TheardTest.refundTeseCase(yborderid,merchantAccount,amount);
method.releaseConnection();
} catch (HttpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
 
/**
* 测试协商接口
* @author shangwei
* @return
* @throws ParseException
*
*/
public static String testConsult() throws ParseException{
String url = "http://xxxxxxx/xxxxxx/consult";
HttpClient4 client =HttpClient4.createDefault();
String data = "";
Date d = new Date();
Calendar now = Calendar.getInstance();
now.setTime(d);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateline=format.format(now.getTime());
System.out.println(dateline);
Date date = format.parse(dateline);
String dates=date.getTime()/1000+"";
System.out.println(dates);
try {
data = AES.encryptToBase64(dates, "12345678901234HH");
} catch (Exception e) {
e.printStackTrace();
}
HttpParameter parameter = new HttpParameter();
parameter.add("data", data);
parameter.add("merchantaccount", "YB01000000078");
HttpResp resp = new HttpResp();
try{
resp=client.doPost(url, parameter, "utf-8");
String respStr= resp.getText("utf-8");
System.out.println(respStr);
String aes=AES.decryptFromBase64(respStr, "12345678901234HH");
System.out.println(aes);
return aes;
}catch (HttpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
client.shutdown();
return "出错啦";
}
public static void refundTeseCase(String yborderid,String merchantAccount,String amount) throws IOException{
String url ="http://xxxxxxxx/xxxxxxx/api/refund/direct";
HttpClient4 client =HttpClient4.createDefault();
HttpParameter parameter = new HttpParameter();
parameter.add("merchantaccount", merchantAccount);
parameter.add("merchantrefundid", "093032323");
parameter.add("transorderid", yborderid);
parameter.add("amount", amount);
HttpResp rep;
try {
rep = client.doPost(url, parameter,"utf-8");
System.out.println(rep.getStatusCode());
System.out.println(rep.getText("utf-8"));
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//测试执行的循环体,根据线程数和循环次数的不同可执行多次,类似于LoadRunner中的Action方法
public SampleResult runTest(JavaSamplerContext arg0) {
results.sampleStart();
try {
testCreditPay();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
results.sampleEnd();
results.setSuccessful(true);
return results;
}
//结束方法,实际运行时每个线程仅执行一次,在测试方法运行结束后执行,类似于LoadRunner中的end方法
public void teardownTest(JavaSamplerContext arg0) {
}
}
  3、将写好的class类和该类引入到的类都打成jar包,放到jemter文件的lib/ext文件下。将用到的其他的jar包放到lib文件夹下面。
  4、启动jemter后,创建先添加线程组,在添加sampler的java请求,如果之前步骤成功,在类名称下拉列表里会出现测试代码打好jar包的类。之后操作jemter进行测试就OK啦。
  下面在分享LoadRunner进行性能测试及环境优化。

【转】java接口的性能测试的更多相关文章

  1. Jmeter+jenkins如何快速搭建接口和性能测试持续集成解决方案-[基于windows篇]

    最近在用Jmeter本来想写一个详细的使用教程,突然看到有前辈已经写好了不错的教程,特此"借花献佛"整理出来分享给大家! Jenkins + Jmeter 构建接口.性能测试持续集 ...

  2. java接口调用——webservice就是一个RPC而已

    很多新手一听到接口就蒙逼,不知道接口是什么!其实接口就是RPC,通过远程访问别的程序提供的方法,然后获得该方法执行的接口,而不需要在本地执行该方法.就是本地方法调用的升级版而已,我明天会上一篇如何通过 ...

  3. java 接口的作用和好处

    1.java 接口的作用 http://blog.csdn.net/hack_bug/article/details/7634737 2.一位Java大牛的回答 很多JAVA初级程序员对于接口存在的意 ...

  4. java接口

    一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为( ...

  5. java接口的嵌套

    java接口 1.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值 2.接口中的方法默认都是 public abstract ...

  6. java 接口和抽象类的区别

    java 接口和抽象类的区别抽象类:1.含有抽象方法的类一定为抽象类,反过来抽象类,不一定含有抽象方法:2.抽象类必须用abstract来进行定义,抽象方法也必须用abstract来进行定义:3.抽象 ...

  7. java 接口(上)

    1.接口中的方法都是抽象方法.而普通的抽象类里面不一定都是抽象方法.抽象类中必须有抽象方法,同时也可以有非抽象方法.继承抽象父类的子类中,如果依然有抽象方法,那么这个子类也是抽象类.即只要类中有抽象方 ...

  8. java接口和抽象类

    关于接口 1.创建一个接口,需要使用interface关键字. 2.实现一个接口,需要使用implements关键字. 3.接口的成员属性都是静态常量(默认public static final). ...

  9. python面向对象进阶 反射 单例模式 以及python实现类似java接口功能

    本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和特性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存 ...

随机推荐

  1. C++ Primer 第二章 学习笔记

    在auto一个引用时,auto会忽略顶层const,而保存底层const decltype(sum()) x = i; // I的类型就是sum()返回值的类型

  2. scala学习手记34 - trait方法的延迟绑定

    trait的方法的延迟绑定就是先混入的trait的方法会后调用.这一点从上一节的实例中也可以看出来. 下面再来看一个类似的例子: abstract class Writer { def write(m ...

  3. 从 Spring Cloud 开始,聊聊微服务架构实践之路

    [编者的话]随着公司业务量的飞速发展,平台面临的挑战已经远远大于业务,需求量不断增加,技术人员数量增加,面临的复杂度也大大增加.在这个背景下,平台的技术架构也完成了从传统的单体应用到微服务化的演进. ...

  4. 2012 Multi-University Training Contest 7

    2012 Multi-University Training Contest 7 A.As long as Binbin loves Sangsang B.Dead or alive C.Dragon ...

  5. Oracle操作ORA-02289: 序列不存在

    解决方案:实现创建序列,创建语句如下所示: create sequence employees_seq minvalue maxvalue start increment cache ; 这时候再执行 ...

  6. Linux软件安装-----apache安装

    一. ./configure --prefix=/usr/local/http2 \ --enable-modules=all \ --enble-mods-shared=all \ 开启模块共享: ...

  7. TCP粘包问题及解决方案

    ① TCP是个流协议,它存在粘包问题 TCP是一个基于字节流的传输服务,"流"意味着TCP所传输的数据是没有边界的.这不同于UDP提供基于消息的传输服务,其传输的数据是有边界的.T ...

  8. android6.0、7.0、8.0新特性总结之开发应用时加以考虑的一些主要变更。

    android6.0 参考一:简书Android 6.0 新特性详解 参考二:关于Android6.0以上系统的权限问题 参考三:值得你关注的Android6.0上的重要变化(一) 参考四:值得你关注 ...

  9. Python之paramiko

    一.基础 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.paramiko支持Linux, Solaris, BSD, MacOS X ...

  10. ubuntu下安装交叉编译工具链

    /usr/localmkdir arm 将文件file1复制成文件file2 cp file1 file2 /cp /mnt/hgfs/UbuntuGX/arm-2008q3-linux.tar.gz ...