Karate同feature文件跨场景调用JSON请求体参数不生效问题咨询
问题原因
该异常是同名变量作用域覆盖导致的:
初始代码中test2调用test1时确实传递了名为id的参数,但被调用的test1场景内写了* def id = id这行冗余代码:
- 在test1作用域内用
def id声明变量时,Karate会优先在当前场景作用域创建一个名为id的空变量 - 赋值符号右侧的
id会优先读取当前作用域刚创建的未初始化的id,而非调用方传入的id,最终导致id取值为undefined,请求体赋值失败
修改后的代码能正常运行,是因为传递的参数值来源改为id1,test1内声明的变量名是id,和右侧读取的id1不同名,不会触发作用域覆盖,右侧的id1会正常读取到调用方传入的参数值,因此运行正常。
Karate跨场景调用参数传递规则
- 调用方通过
call read('特征文件路径@场景标签') {参数1: 值1, 参数2: 值2}语法传递的所有键值对,会直接注入到被调用场景的全局作用域,不需要在被调用场景做任何声明就可以直接使用 - 被调用场景如果需要二次处理入参,不要定义和入参同名的变量,避免覆盖原始入参值
- 被调用场景执行完成后,可以通过调用时的接收变量(比如示例代码里的
postuser)获取被调用场景的所有变量,比如postuser.id就能拿到test1内的id值
最优写法参考
你的代码可以直接删除冗余的变量赋值行,简化为如下写法即可正常运行:
Background: * def successBody = 'util/successRequestBody.json' @test1 @ignore Scenario: Verify user Given url * def requestBody = read(successBody) And request requestBody When method post Then status 201 @test2 Scenario: First create new user and then delete same user * def id = '123' * def postuser = call read('user.feature@test1') {id: id} Given url + '/' + id When method delete Then status 204
内容的提问来源于stack exchange,提问作者Maddy
相关产品推荐
相关产品推荐

