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

并行测试中MockServer的Cookie使用:如何实现请求独立响应?

解决并行测试中MockServer返回独立响应的问题

我来帮你搞定并行测试下每个请求从MockServer拿到独立响应的问题!核心思路是给每个测试用例的请求打上唯一标识,让MockServer精准匹配对应请求并返回专属响应,避免并行时的匹配混乱。

具体实现步骤

1. 给每个测试生成唯一标识

在测试的前置步骤里,生成一个仅属于当前测试的唯一值(比如sessionId、自定义测试ID),同时定义该测试需要的独立响应内容:

before(:each) do
  # 生成当前测试专属的sessionId
  @test_session_id = SecureRandom.hex
  # 定义当前测试的独立响应(可根据测试场景自定义)
  @unique_transaction_response = {
    transaction_id: SecureRandom.uuid,
    status: 'success',
    test_tag: @test_session_id # 方便验证响应归属
  }
end

2. 修改MockServer期望,精准匹配唯一标识

调整你的mock方法,让它接收测试专属的标识和响应内容,确保只有携带该标识的请求才会触发对应的响应,同时设置单次匹配避免被其他测试复用:

def mock_transaction_request(session_id, custom_response)
  client = initialize_mock
  expectation = expectation do |e|
    e.request do |request|
      request.method = 'POST'
      request.path = '/transactions'
      # 精准匹配当前测试的sessionId
      request.cookies << cookie('sessionId', session_id)
    end
    e.response do |response|
      response.status_code = 200
      response.body = custom_response.to_json
      response.headers << header('Content-Type', 'application/json')
    end
    # 限制该期望仅匹配1次,防止并行测试中被其他请求命中
    e.times = 1
  end
  client.register(expectation)
end

3. 在测试中发送带唯一标识的请求

调用mock方法注册专属期望,然后发送请求时携带对应的sessionId,确保请求能匹配到自己的Mock响应:

it 'handles parallel transaction with unique response' do
  # 注册当前测试的专属Mock期望
  mock_transaction_request(@test_session_id, @unique_transaction_response)
  
  # 发送请求时携带专属sessionId
  api_response = post(
    '/transactions',
    headers: { 'Cookie' => "sessionId=#{@test_session_id}" },
    body: { amount: 100 }.to_json
  )
  
  # 验证返回的是当前测试的独立响应
  parsed_response = JSON.parse(api_response.body)
  expect(parsed_response['transaction_id']).to eq(@unique_transaction_response[:transaction_id])
  expect(parsed_response['test_tag']).to eq(@test_session_id)
end

4. 测试后清理专属期望(可选但推荐)

为了彻底避免并行测试间的干扰,在测试结束后清理当前测试注册的Mock期望:

after(:each) do
  client = initialize_mock
  # 清理携带当前sessionId的所有期望
  client.clear(request do |r|
    r.cookies << cookie('sessionId', @test_session_id)
  end)
end

其他可选方案

如果不想用cookie,也可以用自定义请求头或者请求参数作为唯一标识,比如:

  • 用X-Test-Id头:request.headers << header('X-Test-Id', test_id)
  • 用请求体里的唯一参数:request.body = { test_id: test_id }.to_json

核心逻辑都是一致的:让每个测试的请求拥有独一无二的特征,MockServer根据这个特征返回对应的独立响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:20:02