springboot项目中进行并发测试
一 利用工具包:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.databene</groupId> <artifactId>contiperf</artifactId> <version>2.3.4</version> <scope>test</scope> </dependency>
引入者两个依赖:
就可以进行测试了,看测试代码:
package com.cxy.springs; import com.cxy.springs.entity.TUser; import com.cxy.springs.service.TUserService; import org.databene.contiperf.PerfTest; import org.databene.contiperf.junit.ContiPerfRule; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class SpringsApplicationTests { @Autowired public TUserService userService; @Test public void contextLoads() { } //引入 ContiPerf 进行性能测试 @Rule public ContiPerfRule contiPerfRule = new ContiPerfRule(); @Test //10个线程 执行10次 @PerfTest(invocations = 100,threads = 10) public void test() { TUser load = userService.load(1); System.out.println(load.getPhone()); } }
结果:
不知道为什么我的图片挂了
第二种方式:
利用concurrent包下列进行测试,不过他们没有具体的相应时间:
package com.cxy.springs; import com.cxy.springs.entity.TUser; import com.cxy.springs.service.TUserService; import org.databene.contiperf.PerfTest; import org.databene.contiperf.junit.ContiPerfRule; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; @RunWith(SpringRunner.class) @SpringBootTest public class SpringsApplicationTests { @Autowired public TUserService userService; @Test public void contextLoads() { } //引入 ContiPerf 进行性能测试 @Rule public ContiPerfRule contiPerfRule = new ContiPerfRule(); @Test //10个线程 执行10次 @PerfTest(invocations = 100,threads = 10) public void test() { TUser load = userService.load(1); System.out.println(load.getPhone()); } @Test public void test2()throws Exception{ ExecutorService executorService = Executors.newCachedThreadPool(); final Semaphore semaphore = new Semaphore(200); final CountDownLatch countDownLatch = new CountDownLatch(500); long l = System.currentTimeMillis(); for (int i = 0; i < 200; i++) { final int count = i; executorService.execute(() -> { try { semaphore.acquire(); TUser load = userService.load(1); System.out.println(load.getPhone()); semaphore.release(); } catch (Exception e) { // log.error("exception" , e); } countDownLatch.countDown(); }); } countDownLatch.await(); long a = System.currentTimeMillis(); System.out.println(a-l); executorService.shutdown(); //log.info("size:{}" , map.size()); } }
这个开始时候给了5000个,直接把我数据库搞炸了,
后来改了,也还是可以测试的,如果需要使用这个那么需要整合线程池了,不然那么多的连接夯在那里会一直不走