如何使用Java代码测试API的性能

目前手头的项目是对几个API接口进行功能和性能测试。下面我简单的介绍一下。

功能很简单,首先有一个产生Access_Token的API,这个token就是用来给其他API做认证用的;其他的API就是很普通的restAPI。

性能测试主要是压力测试,目标是能得到系统的瓶颈在哪里。第一个是看看1分钟能接受多少个request,第2个是看看能接受多少个并发用户,第3个是看看1个小时能接受多少个request。

功能嘛,很简单,POSTMAN就搞定,此处不展开来讲了。

主要来说说性能,考虑过JMETER,因为没怎么用过,没经验,所以就想着自己写代码测吧。 下面我会把用到的代码一并贴出。

--------------------------------------

对于1分钟能接受多少request是极限,我是这么做的,1分钟是60000ms,首先看看200个request系统是否能顶住,那就是每隔300ms发1个请求,总共发200个,也就完成了1分钟200个请求。其实这些都是可以在MAIN函数调整的,比如调整成1个小时发5000个也可以,比如测试并发,就是每隔0ms发送20个请求,就是测试20个并发了。代码奉上,自己消化:

--------------****************---------------

public class RestTest {

private static Queue<Long> accesses = new LinkedList<Long>();

private static int rateLimit = 10;

private static RestTemplate restTemplate = new RestTemplate();

public static void accessTest() {
removeOldAccesses();
if (accesses.size() >= rateLimit) {
System.out.println("Rate limit exceeded.");
} else {
long access = System.currentTimeMillis();
accesses.add(access);
}
}

private static synchronized void removeOldAccesses() {
long oneMiniteAgo = System.currentTimeMillis() - 10000;
while (!accesses.isEmpty() && accesses.peek() < oneMiniteAgo) {
long removed = accesses.poll();
System.out.println("Removed access: " + removed);
}
}

private static void postCustomer(String server, String token, String body) {
long startTime = System.currentTimeMillis();

String customerUrl = server + "/integrate.customer";

HttpHeaders httpHeaders = createBizHeaders(token);

HttpEntity<String> httpEntity = new HttpEntity<String>(body, httpHeaders);

ResponseEntity<String> response = restTemplate.exchange(customerUrl, HttpMethod.POST, httpEntity, String.class);
System.out.println((System.currentTimeMillis() - startTime) + " ------------"+response.getBody());
}

private static String getAccessToken(String server) {
String getTokenUrl = server + "/integrate.getToken?grant_type=client_credentials";
HttpHeaders httpHeaders = createGetTokenHeaders();

HttpEntity<String> httpEntity = new HttpEntity<String>(null, httpHeaders);

ResponseEntity<Map> response = restTemplate.exchange(getTokenUrl, HttpMethod.POST, httpEntity, Map.class);
Map r = response.getBody();
String accessToken = r.get("access_token").toString();

return accessToken;
}

private static HttpHeaders createGetTokenHeaders() {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("Accept", "application/json");
httpHeaders.set("content-type", "application/x-www-form-urlencoded");
httpHeaders.set("Authorization", "Basic YWN");
return httpHeaders;
}

private static HttpHeaders createBizHeaders(String token) {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("Accept", "application/json");
httpHeaders.set("content-type", "application/json");
httpHeaders.set("Authorization", "OAuth " + token);
return httpHeaders;
}

private static String readToString(String fileName) {
String encoding = "UTF-8";
File file = new File(fileName);
Long filelength = file.length();
byte[] filecontent = new byte[filelength.intValue()];
try {
FileInputStream in = new FileInputStream(file);
in.read(filecontent);
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
return new String(filecontent, encoding);
} catch (UnsupportedEncodingException e) {
System.err.println("The OS does not support " + encoding);
e.printStackTrace();
return null;
}
}

private static void postCustomerNewThread(final String server, final String token, final String body) {
new Thread(new Runnable() {
@Override
public void run() {
postCustomer(server, token, body);
}
}).start();
}

public static void main(String[] args) throws Exception {
int requestNumber = 200;
long requestInterval = 300;

final String server = "http://localhost:8080";
final String token = getAccessToken(server);
final String body = readToString("D:customer.json");

for (int i = 1; i <= requestNumber; i++) {
postCustomerNewThread(server, token, body);
Thread.sleep(requestInterval);
}
}

}

时间: 2024-11-04 11:21:46

如何使用Java代码测试API的性能的相关文章

解决java代码测试http协议505错误

代码功能:通过java代码获取网页源代码: 所用工具:Myclipse8.5+tomcat6.0+浏览器 系统环境:windows xp旗舰版火狐浏览器版本: IE浏览器版本: 测试http协议有错误java代码如下. import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.

20.fastDFS集群java代码测试

1.工程结构 2.代码内容 FastdfsClientTest.java代码 package cn.itcast.fastdfs.cliennt; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.UUID; import org.csource.common.NameVal

StopWatch 监控Java代码运行时间和分析性能

背景 有时我们在做开发的时候需要记录每个任务执行时间,或者记录一段代码执行时间,最简单的方法就是打印当前时间与执行完时间的差值,然后这样如果执行大量测试的话就很麻烦,并且不直观,如果想对执行的时间做进一步控制,则需要在程序中很多地方修改,目前spring-framework提供了一个StopWatch类可以做类似任务执行时间控制,也就是封装了一个对开始时间,结束时间记录操作的Java类,小例一则如下 实例 package com.example.stopwatch; import org.spr

java代码测试---插入排序和选择排序

1 public class QuickSort { 2 3 //插入排序 4 //插入前的序列是排序好的,将新插入的数值与之前的数值比较 5 //直到找到合适的位置 6 public static int[] quickSort(int[] arr){ 7 8 for(int j=1;j<arr.length;j++){ 9 int key = arr[j]; 10 int i = j-1; 11 12 while(i>=0 && arr[i]<key){ 13 arr

Java 代码性能优化总结

35 个 Java 代码性能优化总结 前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了.代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨:但是如果有足够的时间开发.维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率

干货 | 云智慧透视宝Java代码性能监控实现原理

这篇图文并茂,高端大气上档次,思维缜密的文章,一看就和我平时的风格不同.对了.这不是我写的,是我家高大英俊,写一手好代码,炒一手好菜的男神架构师老公的大作,曾发表于技术公号,经本人授权转载,如有技术问题,我代为请他本人解答~~ 一.Java平台体系及应用场景 从1995年Sun Microsystems公司正式推出Java,到2006年时Sun公司将其开源,迄今为止已经有了20年的历史.Java本身已不仅仅只是一门面向对象的编程语言,而是由一系列计算机软件和规范形成的技术体系,这个技术体系提供了

Android Java使用JavaMail API发送和接收邮件的代码示例

JavaMail是Oracle甲骨文开发的Java邮件类API,支持多种邮件协议,这里我们就来看一下Java使用JavaMail API发送和接收邮件的代码示例 使用Javamail发送邮件,必需的jar包(请下载javamail的源文件,官方下载页:http://www.oracle.com/technetwork/java/javamail/index-138643.html):mailapi.jar.定义了收发邮件所使用到的接口API:smtp.jar.包含了发送邮件使用到的类:pop3.

书写性能良好的java代码

书写性能良好的java代码 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面 第一,控制资源的使用,通过线程同步来控制资源的并发访问 第二,控制实例的产生,以达到节约资源的目的 第三,控制数据共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信 2.尽量避免随意使用静态变量 要知道,当某个对象被定义为stataic变量所引用,那么gc通常是不会回收这个对象所占有的内存,如

API Studio 5.1.2 版本更新:加入全局搜索、支持批量测试API测试用例、读取代码注解生成文档支持Github与码云等

最近在EOLINKER的开发任务繁重,许久在博客园没有更新产品动态了,经过这些日子,EOLINKER又有了长足的进步,增加了更多易用的功能,比如加入全局搜索.支持批量测试API测试用例.读取代码注解生成文档支持Github与码云等.接下来我们来看看刚刚更新API Studio 5.1.2 版本有什么内容吧!开发不易,熬夜熬得我头发都掉得更快了! 1.读取代码注解生成文档新增对Github.码云的支持 支持通过Github.Gitlab.码云等代码仓库来读取代码的注解并自动生成API文档,支持Ja