You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程方式测试Spring Boot REST API的多并行请求?

如何编程实现REST API多并行请求集成测试

当然可以通过编程方式实现多并行请求测试,下面给你两种实用方案,基于你提供的测试代码改造:

方案一:用Java线程池手动实现并行请求

通过ExecutorService创建线程池,批量提交MockMvc请求任务,等待所有任务完成后统一验证结果,适合需要精细控制线程逻辑的场景。

修改你的测试方法,示例代码如下:

@Test
public void testParallelRequests() throws InterruptedException, ExecutionException {
    // 初始化固定大小线程池,这里模拟10个并行请求
    ExecutorService executorService = Executors.newFixedThreadPool(10);
    List<Callable<MvcResult>> requestTasks = new ArrayList<>();

    // 构造多个请求任务
    for (int i = 0; i < 10; i++) {
        requestTasks.add(() -> {
            // 这里替换成你的目标请求构造逻辑
            RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/api/products")
                    .contentType(MediaType.APPLICATION_JSON);
            try {
                return mockMvc.perform(requestBuilder).andReturn();
            } catch (Exception e) {
                throw new RuntimeException("请求执行失败", e);
            }
        });
    }

    // 提交所有任务并等待执行完成
    List<Future<MvcResult>> taskResults = executorService.invokeAll(requestTasks);
    executorService.shutdown();

    // 逐个验证响应状态
    for (Future<MvcResult> resultFuture : taskResults) {
        MvcResult result = resultFuture.get();
        assertEquals(HttpStatus.OK.value(), result.getResponse().getStatus());
    }
}

注意事项

  • 线程池大小可根据测试场景调整,避免过大导致服务器资源耗尽
  • Spring的MockMvc本身是线程安全的,可直接在多线程环境复用
  • 如果你Mock了SomeService,Mockito的@Mock对象默认线程安全,但如果存根逻辑涉及共享状态,需要额外处理线程同步

方案二:用JUnit 5并行参数化测试(简化版)

如果你的测试已经基于JUnit 5(测试类已添加@ExtendWith(SpringExtension.class)),可以通过开启JUnit并行执行+参数化测试来快速实现多请求并行,无需手动管理线程池。

  1. 首先在src/test/resources/junit-platform.properties中添加配置:
junit.jupiter.execution.parallel.enabled=true
junit.jupiter.execution.parallel.mode.default=concurrent
  1. 编写参数化测试方法:
@ParameterizedTest
@ValueSource(ints = {1,2,3,4,5,6,7,8,9,10}) // 指定执行10次请求
public void testParallelRequestsWithJUnit5(int requestIndex) throws Exception {
    // 构造请求
    RequestBuilder requestBuilder = MockMvcRequestBuilders.get("/api/products")
            .contentType(MediaType.APPLICATION_JSON);
    MvcResult result = mockMvc.perform(requestBuilder).andReturn();
    // 验证响应
    assertEquals(HttpStatus.OK.value(), result.getResponse().getStatus());
}

额外提示

你原测试类中有两处拼写错误,需要修正才能正常运行:

  • WebAplicationContext → WebApplicationContext
  • ActivePRofiles → ActiveProfiles

内容的提问来源于stack exchange,提问作者Andulos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 00:06:18