在日常开发中需要对代码进行并发测试时,你是如何操作的呢?下面推荐几个常用的方法,大家可以学习下!
1
Postman
Postman是一个款http请求模拟工具

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("test")
public class TestConrtoller {
@GetMapping("demo")
public String testDemo() {
return "result~";
}
}

为了便于操作,一般会将
http://127.0.0.1:8080 是经常使用的地址+端口号,可以设置为环境
点击右上角的设置图标

选择global

输入信息

以后再进行测试就能这样搞简写了

知道基本使用之后,我们来看一下如何模拟并发测试


填写基本信息后,创建



这个时候就可以在Concurrency下看到这个接口测试了

选择并发测试:

这个时候弹出我们想要的框了


2
Apache Bench(AB)
网站:传送门 http://httpd.apache.org/download.cgi
因为我的操作系统是windows10, 这里选择File for Microsoft Windows
Linux下的安装是非常简单的,这里不再演示

选择 ApacheHaus

进入下载页面 选择适合自己电脑的版本



运行根目录,修改成自己解压到本地的路径



DocumentRoot 测试文件存放地,且该目录必须存在

配置完成后,命令行cmd进入D:\softUtil\Apache24\bin目录下
httpd.exe -k install

启动:
httpd.exe -k start
测试:
-n :请求数
-c: 并发数

3
并发模拟工具JMeter
JMeter也是一款性能测试工具,是图形化的。
下载地址:传送门 http://jmeter.apache.org/

需要Java8+的环境

解压到你觉得合适的目录下(注意最好是英文路径)
进入它的bin目录下 启动jmeter.bat即可

使用很简单,首先在测试计划部分新建一个线程组



设置好基础信息后添加HTTP请求(基本信息设置好没有OK哈,直接添加HTTP请求)

填写HTTP请求相关的内容

之后还要添加监听器,这里选择是图形结果

再添加一个查看结果树吧

在运行之前打开log Viewer

下面开始运行:

执行成功,来感受一下结果:

点进去

查看结果树

4
代码模拟

CountDownLatch类只提供了一个构造器:
public CountDownLatch(int count) { }; //参数count为计数值
然后下面这3个方法是CountDownLatch类中最重要的方法(上图能够反映出来)
public void await() throws InterruptedException { }; //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { }; //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
public void countDown() { }; //将count值减1
-
用于获取权限的acquire(),其底层实现与CountDownLatch.countdown()类似; -
用于释放权限的release(),其底层实现与acquire()是一个互逆的过程。
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.*;
@Slf4j
public class CuncurrencyTest {
// 请求总数
public static int clientTotal = 5000;
// 同时并发执行的线程总数
public static int threadTotal = 200;
public static int count = 0;
public static void main(String[] args) throws InterruptedException {
// 定义线程池
ExecutorService executorService = Executors.newCachedThreadPool();
// 定义信号量 最大的线程数量
final Semaphore semaphore = new Semaphore(threadTotal);
final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
for (int i = 0; i < clientTotal; i++) {
executorService.execute(() -> {
try {
semaphore.acquire();
add();
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
log.error("exception",e);
}
countDownLatch.countDown();
});
}
countDownLatch.await();
executorService.shutdown();
log.info("count:{}",count);
}
private static void add() {
count++;
}
}
因为count不是线程安全的,且没有作防护措施,结果是错的

上面是对代码的并发模拟的简单形式,值得注意的是,这里提到的两个类不是专门做并发模拟,它们的用途很广泛,等之后更新Java网络编程的东西的时候,还会详细介绍它们。
来源:blog.csdn.net/qq_42322103/article/details/102736170
【福利】2023 高薪课程,全面来袭(视频+笔记+源码)
往期推荐

