Karate测试:如何在不同场景间传递响应中的值
Karate跨场景传递Offer ID问题解决
你遇到的核心问题是Karate中每个Scenario的变量上下文是独立隔离的——第一个Scenario里用* def offerId = response.id定义的变量,只能在该Scenario内部使用,第二个Scenario无法直接访问,这就是跨场景传递失败的原因。你尝试的示例是在同一个Scenario里连续执行请求,变量在同一上下文内自然能复用,但跨Scenario就不适用了。
方案一:用call调用创建Offer的Scenario并获取返回值
把创建Offer的逻辑封装成可调用的Scenario,在查询Offer的Scenario里调用它拿到返回的offerId,这种方式符合测试隔离原则,是推荐的做法:
Scenario: create offer Given url 'url/to_create_offer' When request readJsonAsBody And method POST Then status 202 * def offerId = response.id * return offerId # 将offerId作为返回值 Scenario: get offer # 调用创建offer的Scenario,获取返回的offerId * def createdOfferId = call read('this.feature@create offer') # 拼接URL时直接使用返回的ID Given url 'url/to_get_created_offer/' + createdOfferId And method GET Then status 200
方案二:使用全局变量karate.set()
如果需要在多个Feature或Scenario间共享变量,可以用karate.set()设置全局变量,注意全局变量会在所有测试中共享,可能引发依赖问题,需谨慎使用:
Scenario: create offer Given url 'url/to_create_offer' When request readJsonAsBody And method POST Then status 202 * def offerId = response.id * karate.set('globalOfferId', offerId) # 设置全局变量 Then print offerId Scenario: get offer # 直接使用全局变量拼接URL Given url 'url/to_get_created_offer/' + globalOfferId And method GET Then status 200
内容的提问来源于stack exchange,提问作者declutec
相关产品推荐
相关产品推荐

