这周尝试了一把性能测试,之前都是测试网站的性能测试,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. 【Boost】boost库asio详解5——resolver与endpoint使用说明

    tcp::resolver一般和tcp::resolver::query结合用,通过query这个词顾名思义就知道它是用来查询socket的相应信息,一般而言我们关心socket的东东有address ...

  2. NumPy位操作

    NumPy - 位操作 下面是 NumPy 包中可用的位操作函数. 序号 操作及描述 1. bitwise_and 对数组元素执行位与操作 2. bitwise_or 对数组元素执行位或操作 3. i ...

  3. python中配置文件的使用

    一. 什么是配置文件?为什么要做配置文件? 将所有的代码和配置都变成模块化可配置化,这样就提高了代码的重用性,不再每次都去修改代码内部,这个就是我们逐步要做的事情,可配置化 二. python中的Co ...

  4. WSL安装xfce4

    参考:https://github.com/Microsoft/WSL/issues/637 安装组件 1. win10 上安装 Xming https://sourceforge.net/proje ...

  5. 【PAT-L2-020】功夫传人

    链接:https://www.patest.cn/contests/gplt/L2-020 一门武功能否传承久远并被发扬光大,是要看缘分的.一般来说,师傅传授给徒弟的武功总要打个折扣,于是越往后传,弟 ...

  6. ARM汇编指令集4

    协处理器cp15操作指令: mcr & mrc •mrc用于读取CP15中的寄存器 •mcr用于写入CP15中的寄存器   什么是协处理器? •SoC内部另一处理核心,协助主CPU实现某些功能 ...

  7. react pagination

    class AppPagination extends React.Component { handleChange(pageNum) { this.props.handleChangePage(pa ...

  8. L136

    Newly formed blood vessels may contribute to eye disease: studyA study of Northwestern University (N ...

  9. js 取任意两个数之间的随机整数

    function getRandomInt(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Mat ...

  10. Android application testing with the Android test framework

    目录(?)[-] Android automated testing 1 How to test Android applications Tip 2 Unit tests vs functional ...