并发测试 JAVA
发布于: 2020 年 07 月 22 日
利用线程线程池结合 CountDownLatch 调用 http 请求 实现高并发 api 性能测试
用 JAVA8 的 lamdba 表达式对接口调用时间进行求平均值
JAVA 类如下:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Application.class)
@ActiveProfiles("dev")
public class MyTest {
@Bean
private RestTemplate restTemplate(){
return new RestTemplate();
}
/**
* 定义并发线程数量
*/
private static final int THREAD_NUM = 100;
private static final List<Long> httpTimeList = new ArrayList<>();
@Test
public void test() {
try {
ExecutorService executorService = Executors.newFixedThreadPool(THREAD_NUM);
// 初始化计数器为1
CountDownLatch countDownLatch = new CountDownLatch(1);
for (int i = 0; i < THREAD_NUM; i ++) {
executorService.execute(new Task(countDownLatch, httpTimeList));
}
// 启动多个线程
countDownLatch.countDown();
executorService.shutdown();
while (!executorService.isTerminated()) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Collections.sort(httpTimeList);
double average = httpTimeList.stream().mapToLong(Long::longValue).average().getAsDouble();
System.out.println("平均响应时间:" + average);
System.out.println("95%响应时间:" + httpTimeList.get(94));
} catch (Exception e) {
System.out.println("Exception: " + e);
}
}
/**
* 线程类
*/
private class Task implements Runnable {
private final CountDownLatch startLatch;
private final List<Long> httpTimeList;
public Task(CountDownLatch startLatch, List<Long> httpTimeList) {
this.startLatch = startLatch;
this.httpTimeList = httpTimeList;
}
@Override
public void run() {
try {
// 线程等待
startLatch.await();
long startTime = SystemClock.now();
restTemplate().getForEntity("https://www.baidu.com", String.class);
long endTime = SystemClock.now();
System.out.println(Thread.currentThread().getName() + " ended at: " + endTime + ", cost: " + (endTime - startTime) + " ms.");
httpTimeList.add((endTime - startTime));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
复制代码
测试结果:
平均响应时间:620.21
95%响应时间:637
划线
评论
复制
发布于: 2020 年 07 月 22 日阅读数: 66
王麒宇
关注
还未添加个人签名 2018.03.27 加入
还未添加个人简介
评论