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

如何在Cypress中存储API响应并跨测试使用?现有代码失效求助

问题排查与解决方法

1. 先确认address_id的返回字段是否正确

首先要验证API响应里确实存在address_id字段,在第一个测试的回调里加日志打印完整响应体,确认字段名和路径:

.then((response)=>{
  expect(response.status).to.eq(201)
  cy.log(JSON.stringify(response.body)) // 打印响应体,检查address_id的位置
  Cypress.env('address_id', response.body.address_id);
})

如果发现字段名不是address_id(比如是id),要对应修改取值路径。

2. 用别名存储更可靠

Cypress.env()可能因为异步时序问题导致第二个测试取不到值,改用Cypress的别名机制存储和读取,能确保等待异步操作完成:

it('Create Address',function(){      
  return cy.request({
    method:'POST',
    url: `${Cypress.env('API_URL')}/address/api/v1/addresses`,
    headers:{
      Authorization : `Bearer ${Cypress.env('access_token')}`, // 和第二个测试统一授权头格式
      "Content-Type": 'application/json',
    },
    body:{
      "address_name": "Home",
      "locality_area_street": "16th district",
      "city": "DAKAR",
      "country": "SENEGAL"        
    }          
  }).then((response)=>{
    expect(response.status).to.eq(201)
    cy.wrap(response.body.address_id).as('addressId'); // 用别名存储ID
  })
}) 

it('Add Address',function(){   
  cy.get('@addressId').then(addressId => { // 等待别名的值准备好再执行
    cy.request({
      method:'PUT',
      url: `${Cypress.env('API_URL')}/v1/cart/address`, // 不要硬编码URL,用环境变量拼接
      headers:{
        Authorization : `Bearer ${Cypress.env('access_token')}`,
        "Content-Type": 'application/json',
      },
      body:{
        "addressType": "BILLING",
        "id": addressId
      }          
    }).then((response)=>{
      cy.log(addressId);        
      expect(response.status).to.eq(200)
    })
  })
}) 

3. 合并测试用例避免顺序问题

如果测试配置了并行运行,会打乱执行顺序,把两个步骤合并到同一个测试用例里更稳妥:

it('Create and Add Address',function(){      
  cy.request({
    method:'POST',
    url: `${Cypress.env('API_URL')}/address/api/v1/addresses`,
    headers:{
      Authorization : `Bearer ${Cypress.env('access_token')}`,
      "Content-Type": 'application/json',
    },
    body:{
      "address_name": "Home",
      "locality_area_street": "16th district",
      "city": "DAKAR",
      "country": "SENEGAL"        
    }          
  }).then((response)=>{
    expect(response.status).to.eq(201)
    const addressId = response.body.address_id;
    // 直接在同一个测试里执行后续请求
    return cy.request({
      method:'PUT',
      url: `${Cypress.env('API_URL')}/v1/cart/address`,
      headers:{
        Authorization : `Bearer ${Cypress.env('access_token')}`,
        "Content-Type": 'application/json',
      },
      body:{
        "addressType": "BILLING",
        "id": addressId
      }          
    }).then((response)=>{
      cy.log(addressId);        
      expect(response.status).to.eq(200)
    })
  })
}) 

4. 其他注意点

  • 第一个测试的Authorization头缺少Bearer前缀,要和第二个测试保持一致,避免授权失败;
  • 第二个测试的URL硬编码存在维护风险,用环境变量拼接更规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:26:01